GCC问题:使用依赖于模板参数的基类成员

以下代码无法使用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 ++正式规范中是否有某些内容,还是只是一个怪癖?


有只小跳蛙
浏览 404回答 3
3回答

摇曳的蔷薇

这在gcc-3.4中已更改。C ++解析器在该发行版中变得更加严格-按照规范,但是对于具有旧版或多平台代码库的人来说仍然有些烦人。

ITMISS

编译时的问题B<T>在于,A<T>编译器无法知道其基类(它是模板类),因此编译器无法从基类中了解任何成员。较早的版本通过实际解析基本模板类进行了一些推断,但是ISO C ++指出,这种推断会导致本不应该存在的冲突。在模板中引用基类成员的解决方案是使用this(就像您一样)或专门命名基类:template <typename T> class A {public:&nbsp; &nbsp; T foo;};template <typename T> class B: public A <T> {public:&nbsp; &nbsp; void bar() { cout << A<T>::foo << endl; }};
打开App,查看更多内容
随时随地看视频慕课网APP