when compiling following code:
foo.h:
#include <memory> #include <vector> struct external_class; struct { struct b { std::vector<external_class> bad_vector; }; std::vector<external_class> good_vector; std::shared_ptr<b> b; a(); };
foo.cpp:
#include "foo.h": struct external_class {}; // implement external_class a::a() : good_vector(), // <- easy initialize via default constructor b(std::make_shared<b>()) // <- not involve bad_vector::ctor -> warning { } int main() { a; }
.. -weffc++
flag (gcc) warning
foo.cpp:9:12: warning: ‘a::b::bad_vector’ should initialized in member initialization list [-weffc++] struct b { ^
which totally clear me wonder how should rid of it.
for dependency reasons need forward declaration external_class
, in-class-initialization not possible. provide constructor a::b
, implement inside foo.cpp
still hope there short way initialize a::b
providing initializer a::b::bad_vector
(similar a::good_vector
).
is right? what's syntax (and should have googled find solution?) or have provide constructor b
?
your code fine.
the warning b
not having constructor explicitly default-initializes bad_vector
. default constructor b
default-initializes bad_vector
. b() = default;
doesn't silence warning, have write out b() : bad_vector() { }
. me suggests -weffc++
may obsolete in c++11.
Comments
Post a Comment