我有一个继承自基类模板的类模板。
基类模板有一个带有成员函数模板的数据成员,我想从我的超类中调用它。
我知道,为了消除对成员函数模板的调用歧义,我必须使用关键字,并且必须在超类中template
显式引用。this
this->base_member_obj.template member_function<int>();
所有这一切都很好,除了我正在使用的代码库犯了一个相当不幸的错误,即导入了整个namespace std
,并且我试图调用的模板成员函数被调用set
。包含在框架中的某处std::set
,这导致 GCC 认为我正在尝试声明 astd::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;
}