模板继承类, 调用父类的方法, 编译不过了, 为什么?

dilibolii 2015-11-20 11:21:51
下面几行小程序,VC可以编译过,可是gcc,clang却编译不过:

template<class T>
class Y
{
public:
void f(){};
};
template<class T>
class X:public Y<T>
{
public:
X()
{
f();
}
};
int main()
{
X<int> obj;
return 0;
}

GCC编译提示:
D:\Documents\TestProjects\main.cpp|139|error: there are no arguments to 'f' that depend on a template parameter, so a declaration of 'f' must be available [-fpermissive]|

Clang编译提示:
error: use of undeclared identifier 'f'
f);

我如果改成了Y<T>::f()这样的调用,那就没有问题了。这是为什么呢,这个错误是C++标准规定了的吗?
问题:
1. 对于普通类,而非模板类而言,直接调用基类定义的函数,没有问题。为什么模板类需要我加上父类名称?
2. 这样一来,我在模板类继承体系中,凡是要调用父类的地方,岂不是都要显示的使用父类名称? 这种麻烦能否避免?

可能我理解的不到位,还请指针
谢谢。
...全文
781 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2015-11-20
  • 打赏
  • 举报
回复 1
c++ 两阶段名字查找,对于非 dependent name 都是现场决议的,所以空写 f 的时候,编译器不查找基类 scope,没找到就报错,编译器不查找基类,因为此时基类还是个类模板,到底是什么东西还不定呢。 然后实例化的时候进行第二阶段名字查找,这时候所有类型都是确定的,才能够查找基类 scope。 增加 this 或 Y<T>:: 就是把对 f 的查找延迟到第二阶段,这是 c++ 标准规定的。
ri_aje 2015-11-20
  • 打赏
  • 举报
回复
改成 this->f(); 就可以了。 这样 f 变成 dependent name,就能够找到了。

64,701

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧