繁体   English   中英

当Base和Derived都使用Derived类型参数进行模板化时,调用Base构造函数时发生编译器错误

[英]Compiler Error When Calling Base Constructor when both Base and Derived are Templated With Derived Type Parameter

我正在努力理解为什么以下代码无法编译:

template <class T>
class Base {
    public:
        Base(int a){}
};
template <class T>
class Derived: public Base<T>  {
    public:
        Derived(int a): Base(a){}
};
int main(){}

在我的编译器(带有C ++ 11的gcc 5.4.0)上,这将输出错误消息

error: class 'Derived<T>' does not have any field named 'Base'
         Derived(int a): Base(a){}

我看到这有点类似于成员初始化列表错误中的Template base构造函数调用 ,尽管该测试用例实际上是为我编译的,而这个却没有:主要区别似乎是BaseDerived使用相同的类型参数。 另外,如果我显式添加类型参数或为base提供显式范围,则编译效果很好,例如

template <class T>
class Base {
    public:
        Base(int a){}
};

template <class T>
class Derived: public Base<T>  {
    public:
        Derived(int a): Derived::Base(a){}
};

int main(){}

这是怎么回事? 当使用注入的类名时,我是否会误解?

注入的类名Base是类的一个成员Base ,并且由于基类是相关的,其范围并不限定名称查找期间搜索。 因此,使用名称Base只会找到类模板,而不是注入的Base<T>类名。 这就是为什么必须编写Base<T>

Derived::Base之所以起作用,是因为它导致名称查找被推迟到实例化Derived之前。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM