C++ 在基类中创建驱动内部类的实例
有没有一种方法可以在基类上创建一个内部类的实例,它是在一个驱动类中定义的?见下文C++ 在基类中创建驱动内部类的实例,c++,C++,有没有一种方法可以在基类上创建一个内部类的实例,它是在一个驱动类中定义的?见下文 template<typename D> struct Base { D::Data data; // MSVC 2019 gives me compilation errors. }; struct Derrived : Base<Derrived> { struct Data { bool b = false; int i = 0; };
template<typename D>
struct Base {
D::Data data; // MSVC 2019 gives me compilation errors.
};
struct Derrived : Base<Derrived> {
struct Data {
bool b = false;
int i = 0;
};
};
模板
结构基{
D::Data Data;//MSVC 2019给了我编译错误。
};
结构驱动:基本{
结构数据{
布尔b=假;
int i=0;
};
};
不,这不起作用,原因有两个:
D::Data
的类型取决于作为模板参数的D
的类型,因此这可能会导致编译器的歧义。一些编译器会警告您这一点,例如:
prog.cpp:6:3:错误:在'D::Data'之前需要'typename',因为'D'是一个依赖作用域
数据;
^
因此,D::Data
必须以typename
作为前缀,以让编译器知道Data
实际上是一种类型,而不是其他类型(即常量、成员字段等),例如:
模板
结构基{
typename D::数据;
};
D
模板参数的上下文中,Derrived
是一个不完整的类型,因为在实例化Base
时尚未完全定义它:
prog.cpp:在“struct Base”的实例化中:
进度cpp:9:19:从这里开始需要
程序cpp:6:20:错误:对不完整类型“struct Derrived”的使用无效
typename D::数据;
^~~~
prog.cpp:9:8:注:“struct derrive”的转发声明
结构驱动:基本{
^~~~~~~~
因此,编译器将无法将D::Data
解析为Derrived::Data
,这甚至还没有定义
这回答了你的问题吗?这个问题是关于typedef而不是嵌套类型的,但我相信限制是相同的。链接的问题没有解决我的问题,因为一些细节明显不同。在链接的问题中,传递了模板参数,因此可以在类定义之前定义它,而在我的问题中,它是一个无法预先定义的内部类。