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

Sca*_*ark 3 c++ inheritance templates

我有以下代码,它无法编译

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();
}
Run Code Online (Sandbox Code Playgroud)

编译器发出以下内容.

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

现在我知道我可以简单地按照编译器的建议去做但我无法理解为什么

    using Base< T >::TPtr;
Run Code Online (Sandbox Code Playgroud)

不起作用.

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

有任何想法吗?

Kon*_*lph 9

Base< T >::TPtr是一个所谓的依赖名称,因此您需要在其前面加上typename声明才能生成声明.

此外,using不能使用,typename所以你需要使用一个typedef代替:

typedef typename Base<T>::TPtr TPtr;
Run Code Online (Sandbox Code Playgroud)

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