我有以下代码,但编译失败
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/