下面几行小程序,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. 这样一来,我在模板类继承体系中,凡是要调用父类的地方,岂不是都要显示的使用父类名称? 这种麻烦能否避免?
可能我理解的不到位,还请指针
谢谢。