【发布时间】:2010-09-05 21:36:13
【问题描述】:
以下代码不能用 gcc 编译,但可以用 Visual Studio 编译:
template <typename T> class A {
public:
T foo;
};
template <typename T> class B: public A <T> {
public:
void bar() { cout << foo << endl; }
};
我得到错误:
test.cpp:在成员函数'void B::bar()'中:
test.cpp:11: 错误:'foo' 未在此范围内声明
但它应该是!如果我将bar 更改为
void bar() { cout << this->foo << endl; }
然后它确实编译,但我不认为我必须这样做。 GCC 在此处遵循的 C++ 官方规范中是否有某些内容,还是只是一个怪癖?
【问题讨论】:
-
发生这种情况是因为两阶段名称查找(并非所有编译器都默认使用)。这个问题有4个解决方案:1)使用前缀
A<T>::foo,2)使用前缀this->foo,3)添加声明using A<T>::foo, 4) 使用启用许可模式的全局编译器开关。这些解决方案的优缺点在stackoverflow.com/questions/50321788/… 中进行了描述
标签: c++ templates base-class class-members name-lookup