以下代码无法使用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 ++正式规范中是否有某些内容,还是只是一个怪癖?
3 回答
ITMISS
TA贡献1871条经验 获得超8个赞
编译时的问题B<T>在于,A<T>编译器无法知道其基类(它是模板类),因此编译器无法从基类中了解任何成员。
较早的版本通过实际解析基本模板类进行了一些推断,但是ISO C ++指出,这种推断会导致本不应该存在的冲突。
在模板中引用基类成员的解决方案是使用this(就像您一样)或专门命名基类:
template <typename T> class A {
public:
T foo;
};
template <typename T> class B: public A <T> {
public:
void bar() { cout << A<T>::foo << endl; }
};
- 3 回答
- 0 关注
- 403 浏览
添加回答
举报
0/150
提交
取消