Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在基类中创建驱动内部类的实例_C++ - Fatal编程技术网

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而不是嵌套类型的,但我相信限制是相同的。链接的问题没有解决我的问题,因为一些细节明显不同。在链接的问题中,传递了模板参数,因此可以在类定义之前定义它,而在我的问题中,它是一个无法预先定义的内部类。