为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
有只小跳蛙 2019-12-04 10:28:50
以下代码无法使用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 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

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


查看完整回答
反对 回复 2019-12-04
?
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; }

};


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 403 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信