【发布时间】:2010-09-21 08:49:27
【问题描述】:
我有以下代码,编译失败
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;”语句有效。
有什么想法吗?
【问题讨论】:
-
我不认为
using Base<T>::func;做你认为它做的事情,d.func()工作正常,因为它是从父类继承的。你有什么理由不能做typedef Base<T>::TPtr TPtr? -
我必须使用“typedef typename Base::TPtr TPtr”,但正如我对 Konrad 的评论,是的,这是可行的,但如果我必须这样做的话,它有点违背了继承的目的基于基类定义新类型。
标签: c++ templates inheritance