我希望我的类模板A能够拥有一个仅在B中定义的成员,而B则继承A.
这是理论上可行的代码,但不编译。
template< typename T >
class A
{
public:
typename T::member mSomething;
};
class B : public A< B >
{
public:
struct member
{
int val;
};
};
int main( int argc, char** argv )
{
B* b = new B;
A<B>* a = b;
b->mSomething.val = 5;
if( a->mSomething.val == 5 )
{
std::cout << "doing good";
}
return 0;
}
此代码无法在MSVCP 2010上编译,错误“'member':不是'B'的成员”
我怎么能绕过这个?
答案 0 :(得分:3)
CRTP基类不能访问派生类中定义的类型。实例化A<B>
时,B
是不完整的类型且没有成员,因此您无法访问内容。
您必须在B
之外定义类型。