我有以下代码,但无法编译
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
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)