- 论坛徽章:
- 2
|
20可用积分
下面几行小程序,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. 这样一来,我在模板类继承体系中,凡是要调用父类的地方,岂不是都要显示的使用父类名称? 这种麻烦能否避免?
可能我理解的不到位,还请指针
谢谢。
|
最佳答案
查看完整内容
是。。。处理模板时名字查找的方式不一样。。。不能避免。。。 但除了Y::f()外还有其他方式表达想要调用基类的f。。。1. Y::f()2. this->f()3. using Y::f;为什么X构造函数里写f()不表示调用继承得到的f。。。 至少有这么一个原因。。。如果Y不是模板。。。 那Y一定有f函数。 但Y是类(主)模板。。。 这个就不一定了。。。 比如:Y 就有f, 而Y 就没有。 于是 X就(通过继承)有f, 而X 就没有。只有用具体类型参数去实例化模 ...
|