0

コードがコンパイルされません。以下は私のコードです

template <typename T>

class TemplateClass
{

    const T constMember;
    public:

    TemplateClass()
    {
        constMember = T();
    }

};

int main()
{
   TemplateClass <int> obj;
}

このエラーが発生します:

error: uninitialized member 'TemplateClass<int>::constMember' with 'const' type 'const int'

データメンバーの初期化にはコンストラクターを使っていると思いました。どうしたの????

4

2 に答える 2

11

constメンバーを初期化するのではなく、単に割り当てるだけです。

メンバーの初期化は、メンバー初期化リストを使用してのみ実行できます

例えば:

TemplateClass() : constMember(T()) //initializes constMember to 0
{} 
于 2010-09-21T14:29:21.637 に答える
4

Prasoon はすでにあなたに非常に良い答えを出しています。ただし、コメントにまとめることができなかった追加の点を指摘したいと思います。

すべての型がプリミティブまたは参照のいずれかである言語 (Java、C#) から来た C++ 初心者によって、この間違い (初期化リストの無視) が多く行われるのを見てきました。null複雑な型への参照をデフォルトで初期化し、後で実際のオブジェクトで上書きすることは大したことではありません。ただし、C++ では、参照セマンティックが明示的に選択 (および実装) されない限り、型は値セマンティックを持ちます。

T初期化にコストがかかるタイプだと考えてください。(「高価な」の定義について。そのような型を想像するのが難しい場合は、グラフィック カード ドライバーのコードについて話していると想像してみてください。そのようなコードでは、ほとんどすべてのものが高価です。)コンストラクターの本体は、コンストラクターの本体が実行されるときに既に構築されている必要があります。そうしないと、有効なオブジェクトではなく生のメモリにアクセスすることになります。(構築とは、生のメモリの塊を有効なオブジェクトに変えるものです。)

したがって、コンストラクターの本体でオブジェクトに何かを割り当てると、既に完全に構​​築されたオブジェクトに割り当てられます。コンストラクターを指定しなかったため、オブジェクトはデフォルトのコンストラクターを使用して構築されます。これは、オブジェクトが最初にデフォルトで構築され、次の瞬間にデフォルト値が別のもので上書きされることを意味します。

それは確かにナンセンスです。それが、初期化リストがある理由です。それらを使用して、基本クラスとメンバーのサブオブジェクトを構築するために使用する必要があるコンストラクターをコンパイラーに指定できます。このようにして、オブジェクトは正しい値ですぐに作成されます。

また、ご存じのように、初期化リストは特定のデータ メンバー、つまり定数オブジェクト、参照、およびアクセス可能な既定のコンストラクターを持たない型のオブジェクトを初期化する唯一の方法です。

于 2010-09-21T19:06:00.793 に答える