2

引数のないデフォルトのコンストラクターが必要です。aタイプが不明な属性を初期化するにはどうすればよいですか。

template <typename Type>
class Foo
{
public:
    Foo() : a(), b(0) {}  <---- Here is the confusion

private:
    Type a;
    int b;
};

編集:以下のコメントで回答がありますが、まだわからないことがあります。私が持っている場合:

typedef enum {AB, CD} EnumType

template <typename Type>
class Foo
{
public:
    Foo() {}  // <---- "Member 'b' was no initialized in this constructor"

private:
    Type a;
    EnumType b;
};

私のコンパイラは私にこの警告を出します:Member 'b' was no initialized in this constructorb列挙型であり、列挙型ではないこの警告が表示されるのはなぜaですか?

4

2 に答える 2

2

タイプが不明な属性aを初期化するにはどうすればよいですか。

あなたの解決策は正しいです。C++11規格の8.5/11項によると:

初期化子が空の括弧のセット、つまり()であるオブジェクトは、値で初期化されます。[...]

次に、8.5 / 8項:

タイプTのオブジェクトを値初期化するということは、次のことを意味します。

— Tが(おそらくcv修飾された)クラスタイプ(第9節)であり、デフォルトコンストラクター(12.1)がないか、ユーザー提供または削除されたデフォルトコンストラクターがある場合、オブジェクトはデフォルトで初期化されます。

— Tが(おそらくcv修飾された)非ユニオンクラスタイプであり、ユーザーが提供または削除したデフォルトコンストラクターがない場合、オブジェクトはゼロで初期化され、Tに重要なデフォルトコンストラクターがある場合は、デフォルトで初期化されます。

— Tが配列型の場合、各要素は値で初期化されます。

—それ以外の場合、オブジェクトはゼロで初期化されます。

ついに、

列挙型であり、aではないbに対してこの警告が表示されるのはなぜですか?

これはおそらく、Typeデフォルトで作成できるUDT(ユーザー定義型)であるテンプレート引数を指定したためです。aそうでない場合は、コンパイラーがコンストラクターで初期化されていないことについても警告することを期待します。ただし、コンパイラはそのような警告を発行する必要がないことに注意してください。

于 2013-03-24T21:52:23.363 に答える
1

Typeタイプにデフォルトのコンストラクターがある限り、これは正しいです。テンプレートを宣言するとき、型についていくつかのことを想定していますが、特定のテンプレートのコンストラクターですべての型を渡すことができるわけではありません。ここでは、すべてが標準タイプとデフォルトのコンストラクターを持つタイプで問題ありません。Fooデフォルトのコンストラクターを提供しない独自の型で クラスを初期化すると、エラーになります。

2番目の問題に答えるには:

名前空間スコープで変数を定義した場合、値は0に初期化されます。

enum SomeEnum {  
    EValue1 = 1,  
    EValue2 = 4,  
};
SomeEnum e; // e is 0
int i;      // i is 0

int main()
{
    cout << e << " " << i; //prints 0 0 
}

の列挙子の値eとは異なる値を持つ可能性があることに驚かないでください。SomeEnum各列挙型には基礎となる整数型(、、、、などintshortlongあり、その列挙型のオブジェクトの可能な値のセットは、基礎となる積分型が持つ値のセットです。列挙型は、いくつかの値に便利な名前を付けて新しい型を作成するための単なる方法ですが、列挙型の値のセットによって列挙型の値を制限することはありません。

タイプTのオブジェクトをゼロ初期化するということは、次のことを意味します
。— Tがスカラータイプ(3.9)の場合、オブジェクトはTに変換された値0(ゼロ)に設定されます。

列挙はスカラー型であることに注意してください。

タイプTのオブジェクトを値初期化するということは、次のことを意味します。
—Tがクラスタイプの
場合何とか—Tが非ユニオンクラスタイプの
場合何とか— Tが配列型の場合、何とか何とか—それ以外の場合、オブジェクトはゼロです。 -初期化

typedef enum {a,b,c,d} EnumType;

template <typename Type>
class Foo
{
public:
    Foo() {}  // <---- "Member 'b' was no initialized in this constructor"

public:
    Type a;
    EnumType b;
};

/*
 * 
 */
int main(int argc, char** argv) {

    Foo<int> fo;
    std::cout<<std::endl<<"fo.a:"<<fo.a<<",fo.b:"<<fo.b<<std::endl;
    EnumType e=d;
    fo.b=d;
    std::cout<<std::endl<<"fo.a:"<<fo.a<<",fo.b:"<<fo.b<<std::endl;

    Foo<int>* go=new Foo<int>;
    std::cout<<std::endl<<"go->a:"<<go->a<<",go->b:"<<go->b<<std::endl;
    go->b=d;
    std::cout<<std::endl<<"go->a:"<<go->a<<",go->b:"<<go->b<<std::endl;

fo.a:-137090040、fo.b:32767

fo.a:-137090040、fo.b:3

go-> a:-166889576、go-> b:32767

go-> a:-166889576、go-> b:3

今:

    Foo<int>* go=new Foo<int>();
    std::cout<<std::endl<<"go->a:"<<go->a<<",go->b:"<<go->b<<std::endl;
    go->b=d;
    std::cout<<std::endl<<"go->a:"<<go->a<<",go->b:"<<go->b<<std::endl;

go-> a:0、go-> b:0

go-> a:0、go-> b:3

于 2013-03-24T21:39:59.187 に答える