我有一些 C++ 代码在没有 -fpermissive 选项的情况下不再编译。这是我不能分享的专有代码,但我认为我已经能够提取一个简单的测试用例来证明这个问题。这是 g++ 的输出
template_eg.cpp: In instantiation of 'void Special_List<T>::do_other_stuff(T*) [with T = int]':
template_eg.cpp:27:35: required from here
template_eg.cpp:18:25: error: 'next' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
template_eg.cpp:18:25: note: declarations in dependent base 'List<int>' are not found by unqualified lookup
template_eg.cpp:18:25: note: use 'this->next' instead
所以这里是产生问题的代码:
template<class T> class List
{
public:
void next(T*){
cout<<"Doing some stuff"<<endl;
}
};
template<class T> class Special_List: public List<T>
{
public:
void do_other_stuff(T* item){
next(item);
}
};
int main(int argc, char *argv[])
{
Special_List<int> b;
int test_int = 3;
b.do_other_stuff(&test_int);
}
我不是想找出如何修复代码以使其再次编译。这只是将 next(item) 更改为 this->next(item) 的问题,我试图更好地理解为什么这种更改是必要的。我在此页面上找到了解释:http: //gcc.gnu.org/onlinedocs/gcc/Name-lookup.html 虽然这个解释很有用,但我仍然有一些问题。我的函数采用 T*(指向类型 T 的指针)这一事实不应该使它依赖于模板参数。用我自己的话说,编译器(gcc 4.7)不应该能够找出 next() 函数在基类 List 中吗?为什么有必要在每个这样的调用前面加上 this->?我注意到 clang 3.1 表现出相同的行为,所以我假设 c++ 标准中有一些要求需要这种行为。任何人都可以为此提供理由吗?