我有一个继承自基类模板的类模板。
基类模板有一个数据成员和一个我想从父类(super class)中调用的成员函数模板。
我知道为了消除对成员函数模板的调用的歧义,我必须使用 template
关键字,我必须明确提及 this
在父类(super class)中。
this->base_member_obj.template member_function<int>();
这一切都很好,只是我使用的代码库犯了一个相当不幸的错误,即导入了整个 namespace std
。 ,我试图调用的模板成员函数称为 set
.框架中的某处 std::set
包含在内,这导致 GCC 认为我正在尝试声明 std::set
而不是调用成员函数 set
.
GCC 4.7 抛出错误invalid use of 'class std::set'
请参阅下面的错误示例。如果你注释掉 using namespace std
代码编译正常。
遗憾的是,我无法遍历整个代码库,删除每个 using namespace std
调用,并在每次调用 std 命名空间内的任何内容前加上 std::
还有其他解决办法吗?
#include <set>
using namespace std; // comment this out to compile fine
struct blah
{
template<typename T>
void set()
{ }
};
template<typename T>
struct base
{
blah b;
};
template<typename T>
struct super : base<super<T>>
{
void fun()
{
this->b.template set<int>(); // this line breaks
}
};
int main()
{
super<int> s;
s.fun();
return 0;
}
最佳答案
试试这个:
this->b.blah::template set<int>(); // this line breaks
关于c++ - 无效的模板相关成员函数模板推导 - 认为我正在尝试使用 std::set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10426428/