以下代码无法编译。 我收到一条错误消息:错误C2039:'Asub':不是'C'的成员
有人可以帮助我理解这个吗?
尝试过VS2008& 2010编译器。
template <class T>
class B
{
typedef int Asub;
public:
void DoSomething(typename T::Asub it)
{
}
};
class C : public B<C>
{
public:
typedef int Asub;
};
class A
{
public:
typedef int Asub;
};
int _tmain(int argc, _TCHAR* argv[])
{
C theThing;
theThing.DoSomething(C::Asub());
return 0;
}
答案 0 :(得分:8)
您对此处的编译器有点不公平 - C
在B<C>
完全未知的情况下不完整,而在处理B<C>
时,C
仍然是不完整的类型。 comp.lang.c++.moderated和comp.lang.c++上有类似的主题。
请注意,如果您通过将其移动到成员函数定义来延迟使用它,它会起作用,例如:
struct C : B<C> {
void f() { typedef typename C::Asub Asub; }
};
您可以通过明确向上传递类型来解决问题:
template<class T, class Asub> struct B { /* ... */ };
class C : B<C, int> { /* ... */ };
...或者如果你需要传递更多内容,可以将它们移动到某个特质类:
template<class T, class Traits> struct B {
void DoSomething(typename Traits::Asub it) {}
};
struct CTraits {
typedef int Asub;
};
struct C : B<C, CTraits> {
typedef CTraits::Asub Asub;
};