状況は次のとおりです。
次のファイルで定義されたクラスがあります。
Foo.h ファイル:
template<typename MyType>
class Foo
{
public:
Foo(int number = 50);
private:
typedef enum {VAR1, VAR2} Type;
class Bar
{
MyType a;
Type b;
Bar(int param1, Type param2) : a(param1), b(param2) {}
}
std::vector<Bar> vec;
};
Foo.cpp ファイル:
template<typename MyType>
Foo::Foo(int number) : vec(number)
{ }
問題は、これをコンパイルすると、.cpp ファイルの最初の行に、引数のない Bar のコンストラクターが必要であるというエラーが表示されることです。Fooでベクトルを作成するために必要だと思います。次の .h ファイルを与える Bar の引数なしのコンストラクターを追加しました。
template<typename MyType>
class Foo
{
public:
Foo(int number = 50);
private:
typedef enum {VAR1, VAR2} Type;
class Bar
{
MyType a;
Type b;
Bar() {} // <---- Line added
Bar(int param1, Type param2) : a(param1), b(param2) {}
}
std::vector<Bar> vec;
};
これでコンパイルできて動作しますが、追加したばかりの行にMember 'b' was no initialized in this constructor
. enumに問題があるのでしょうか?
この警告なしで動作させるために何をすべきかわかりません。
編集:空のコンストラクターに初期化リストを追加するようにといういくつかの回答を受け取りました。しかし、私のクラスは実際にはテンプレートクラスでありa
、私には不明な型であるため、型がわからないため初期化できません。Bar の初期化リストでのみ初期化を試みたところb
、うまくいきました。a
ワーニングは消えましたが、未初期化のままでいいですか?Bar の引数なしでコンストラクターを削除し、それでも Foo のコンストラクターのベクトルにサイズを与える方法はありますか?