C++ 初始化构造函数中嵌套成员的语法?

C++ 初始化构造函数中嵌套成员的语法?,c++,constructor,initialization,C++,Constructor,Initialization,编译以下代码时: foo.h: #include <memory> #include <vector> struct external_class; struct A { struct B { std::vector<external_class> bad_vector; }; std::vector<external_class> good_vector; std::shared_ptr<

编译以下代码时:

foo.h

#include <memory>
#include <vector>

struct external_class;

struct A {
    struct B {
        std::vector<external_class> bad_vector;
    };
    std::vector<external_class> good_vector;
    std::shared_ptr<B> b;
    A();
};
#include "foo.h":

struct external_class {};     // implement external_class

A::A() : 
    good_vector(),            // <- easy to initialize via default constructor
    b(std::make_shared<B>())  // <- does not involve bad_vector::ctor -> warning
{ }

int main() { A a; }
这对我来说是完全清楚的,但我想知道我应该如何摆脱它

出于依赖性原因,我需要
外部类
的转发声明,因此类内初始化是不可能的。我可以为
a::B
提供一个构造函数,并在
foo.cpp
中实现它,但我仍然希望通过为
a::B::bad_vector
提供一个初始值设定项(类似于
a::good_vector
)有一个非常短的方法来初始化
a::B

是这样吗?语法是什么(我应该通过谷歌搜索找到解决方案吗?)还是我必须为
B
提供构造函数?

您的代码很好

警告主要是关于
B
没有显式默认初始化
bad_vector
的构造函数。但是
B
的默认构造函数已经默认初始化
bad\u vector
。偶数
B()=默认值
并没有使警告静音,实际上您必须写出
B():bad_vector(){}
。在我看来,
-Weffc++
在C++11中可能已经过时了

您的代码很好


警告主要是关于
B
没有显式默认初始化
bad_vector
的构造函数。但是
B
的默认构造函数已经默认初始化
bad\u vector
。偶数
B()=默认值
并没有使警告静音,实际上您必须写出
B():bad_vector(){}
。在我看来,
-Weffc++
在C++11中可能已经过时了

@juanchopanza也许我得补充一点:
a::good_vector
如果没有实际的定义,那真的是个问题。在我的示例中,它只显示了我想要初始化
A::B::bad_vector
@juanchopanza的方式。也许我必须添加一个东西:
A::good_vector
如果没有实际的定义,这将是一个问题。在我的示例中,它只显示了我想初始化
A::B::bad_向量的方法。因此,在
A::A()
内部没有一种初始化
A::B::bad_向量的方法,它类似于
A::B
的初始值设定项列表,为什么没有呢?a) 用户定义的构造函数b)聚合初始化在本例中聚合初始化是什么样子的?我想这个术语就是我一直在寻找的,但我不知道在这种情况下我会怎么做。@Barry:答案告诉我我想用C++14做什么是可能的吗?所以没有一种方法可以在
a::B::bad_vector
中通过类似于
a::B
的初始值设定项列表来初始化
a::a()
?为什么没有呢?a) 用户定义的构造函数b)聚合初始化在本例中聚合初始化是什么样子的?我想这个术语是我一直在寻找的,但我不知道在这种情况下我会怎么做。@Barry:答案是否告诉我,我想用C++14做的事情是可能的?
foo.cpp:9:12: warning: ‘A::B::bad_vector’ should be initialized in the member initialization list [-Weffc++]
     struct B {
            ^