基类型的 C++ 模板继承问题

标签 c++ templates inheritance

我有以下代码,但编译失败

template < typename T >
class Base
{
public:

    typedef T * TPtr;

    void func()
    {
    }
};

template < typename T >
class Derived : public Base< T >
{
public:
    using Base< T >::TPtr;
    using Base< T >::func;

    TPtr ptr;
};

int main( int c, char *v[] )
{
    Derived< int > d;
    d.func();
}

编译器发出以下信息。

t.cpp:16: error: 'TPtr' does not name a type
t.cpp:16: note: (perhaps 'typename Base<T>::TPtr' was intended)

现在我知道我可以简单地按照编译器的建议去做,但我不明白为什么

    using Base< T >::TPtr;

不起作用。

如果我注释掉“TPtr ptr”行,那么它会编译,证明“using Base< T >::func;”语句有效。

有什么想法吗?

最佳答案

Base< T >::TPtr是所谓的从属名称,因此您需要在其前面加上typename 前缀使声明生效。

此外,using不适用于 typename所以你需要使用 typedef相反:

typedef typename Base<T>::TPtr TPtr;

问题是编译器无法决定——不知道是什么T是! – 是否TPtr在此上下文中命名类型或变量/函数。为了避免歧义,它总是假设后者,除非另有明确说明(因此需要 typename )。

关于基类型的 C++ 模板继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3758656/

相关文章:

objective-c - 是否有任何好的开源 Mac 应用程序模板

具有两种类型的 Java 自引用泛型

java - 让继承类实现父类(super class)的方法

c++ - 在c++中修改时间程序时出现逻辑错误

c++ - 实现模板运算符非友元

c++ - 如何在模板类的内部类中编写虚函数?

c++ - 类模板构造函数中引用的未解析外部符号(在 VS 2008 中)

c# - Xaml 使用隐藏属性

c++ - 子数组是否保证线性分配?

C++:如何一次输出两个字母的字符串?