我希望派生类成为模板类的后代。该类取决于后代的成员。 简而言之,我希望这段代码能够编译:
struct IBootParams
{
virtual bool GetImmediate() = 0;
};
template <class T>
struct TBootBootParams
{
typename T::TransType transferType;
typename T::UseAbort_ useAbort;
bool GetImmediate()
{
if ( transferType == T::e1 )
{
return useAbort.someFlag;
}
return false;
}
};
struct BootBootParams : public TBootBootParams<BootBootParams>
{
enum SomeEnum
{
e1=0,
e2,
e3
};
struct UseAbort
{
bool someFlag;
char someMember;
int otherMember;
} useAbort;
typedef SomeEnum TransType;
typedef UseAbort UseAbort_;
};
struct BootAltBootParams : public TBootBootParams<BootAltBootParams>
{
enum SomeEnum
{
e1=5,
e2,
e3
};
struct UseAbort
{
bool someFlag;
long long someMember;
long long otherMember;
} useAbort;
typedef SomeEnum TransType;
typedef UseAbort UseAbort_;
};
int _tmain(int argc, _TCHAR* argv[])
{
BootBootParams bp;
BootAltBootParams bpa;
bool f = bp.GetImmediate();
f = bpa.GetImmediate();
}
最佳答案
你不能这样做。当编译器实例化 TBootBootParams<BootBootParams>
它还没有完全读取 BootBootParams 的完整定义,因此您无法从 TBootBootParams 定义内部访问其成员(TBootBootParams 的成员函数是一个异常(exception),因为它们稍后会实例化)。
通常的解决方案是有一个特征类:
template<class T> struct TBootBootParams_traits;
template <class T>
struct TBootBootParams
{
typename TBootBootParams_traits<T>::TransType transferType;
typename TBootBootParams_traits<T>::UseAbort_ useAbort;
bool GetImmediate()
{
if ( transferType == TBootBootParams_traits<T>::e1 )
{
return useAbort.someFlag;
}
return false;
}
};
struct BootBootParams;
template<> struct TBootBootParams_traits<BootBootParams>
{
enum SomeEnum
{
e1=5,
e2,
e3
};
struct UseAbort
{
bool someFlag;
long long someMember;
long long otherMember;
};
typedef SomeEnum TransType;
typedef UseAbort UseAbort_;
};
struct BootBootParams :
public TBootBootParams<BootBootParams>,
public TBootBootParams_traits<BootBootParams>
{
UseAbort_ useAbort;
};
关于c++ - 在基类中使用派生类的 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4479871/