1

実行時に静的メンバーを持つテンプレート構造体を持つクラスに関する情報を保存しようとしていますが、エラーなしで静的メンバーを取得または設定できません。

このコードが機能しないのはなぜですか?

template <typename T>
struct InfoHolder
{
    static const char* name;    
};

int main()
{
    InfoHolder<int>::name = "This is an integer";
    cout << InfoHolder<int>::name << endl;

    return 0;
}
4

2 に答える 2

2

リンカー エラーが発生した場合。name変数をどこかに定義する必要があります。(クラスで宣言しても、オブジェクトの一部ではないため、どこにも割り当てられません)

クラスの後、メインの前にこれを書きます:

template <typename T>
const char *InfoHolder<T>::name;

これは、静的データ メンバーの小さな不便です。

于 2012-11-20T00:22:53.240 に答える
0

これが他の場所で使用されているのを見ました。

構造体の静的メンバーは割り当てられていないため、関数から静的メンバーを使用して、変数へのポインターを返すことができます。

template <typename T>
struct InfoHolder
{
    static const char** getName()
    {
        static const char* name;
        return &name;
    }
};

int main()
{
    *InfoHolder<int>::getName() = "This is an integer";
    *InfoHolder<MyClass>::getName() = "This is an MyClass";
    *InfoHolder<OtherClass>::getName() = "This is an OtherClass";
    cout << *InfoHolder<int>::getName() << endl;
    cout << *InfoHolder<MyClass>::getName() << endl;
    cout << *InfoHolder<OtherClass>::getName() << endl;
}
于 2012-11-20T00:28:04.130 に答える