這裏的情況是:的std ::矢量<Bar>在Foo類的成員變量需要一個空的構造函數酒吧
我有以下文件中定義的類。
了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文件中:
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
。問題與枚舉,也許?
我不明白我應該怎麼做才能讓它在沒有這個警告的情況下工作。
編輯:我收到了一些答案,說要添加一個初始化列表到空的構造函數。然而,我的班級實際上是一個模板班,a
對我來說是一個未知的類型,所以我不能初始化它,因爲我不知道它的類型。我嘗試初始化Bar中的初始化列表中的b
,它工作正常。警告消失了,但是可以讓a
未初始化嗎?有沒有辦法刪除沒有Bar參數的構造函數,並仍然給Foo的構造函數中的向量賦予一個大小?
原始類型,例如'int'和'enum',默認情況下未初始化。非原始類型,比如'struct foo {int a;}'有它們的空構造函數調用(在上面的'foo'中,隱式空構造函數什麼都不做,因爲'int'是一個基本類型,默認情況下保持未初始化。警告是說你有一個原始類型的實例,它沒有被你的構造函數初始化。如果'a'不是原始類型,'Bar():b(VAR1){}'等價於Bar():a(),b(VAR1){}' - 如果它是基本類型,那麼它是未初始化的。總之,使用'Bar():a(),b(VAR1){}' – Yakk 2013-03-24 10:59:39