gpt4 book ai didi

c++ - 在基类中使用派生类的 typedef

转载 作者:IT老高 更新时间:2023-10-28 23:15:20 30 4
gpt4 key购买 nike

我希望派生类成为模板类的后代。该类取决于后代的成员。简而言之,我希望这段代码能够编译:

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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com