4

私は次のようなことを試みています:

struct MyType { };

template <typename T>
struct Test
{
    static const MyType * const sm_object;
};

template <>
struct Test<void>
{
    static const MyType * const sm_object;
};

template <typename T> const MyType * const Test<T>::sm_object = new MyType();
template <> const MyType * const Test<void>::sm_object = new MyType();

これを2つのファイル(a.cppとb.cpp)に含めます。私はコンパイルして取得しようとします:

error C2998: 'const MyType *Test<void>::sm_object' : cannot be a template definition

私のC++構文は悪いと思いますが、私が間違っていることを考えることはできません。

template<>複数の変換単位でこれが必要なため、変数定義からを削除できません。これにより、リンクエラーが発生します。

フィールドを基本クラスに入れ、CRTPを使用してタイプごとに新しいインスタンスを作成すると、特殊化が邪魔になりませんが、この「直接」フィールド初期化が機能しないのはなぜですか?構文の一部が欠落している必要があります。

私はVS2003を使用しています:(

4

3 に答える 3

6

template<>g ++から判断すると、その行からを削除し、残りを1つのソースファイル(ヘッダーではなく)に入れる必要があると思います。これは特殊化であるため、ヘッダーで定義しない通常の非テンプレート静的と同じです。

いくつかの.Cファイル:

const MyType * const Test<void>::sm_object = new MyType();

于 2011-01-05T15:04:36.523 に答える
2

私はあなたがこのようなことをしたいと思っていると信じています

struct MyType { };

template <typename T>
struct Test
{
    static const MyType * const sm_object;
    static const MyType* set_object()
    {
        return nullptr;
    }
};

template <>
struct Test<void>
{
    static const MyType * const sm_object;
    static const MyType* set_object()
    {
        return new MyType();
    }
};

template <typename T> 
const MyType * Test<T>::sm_object = Test< T >::set_object();
于 2011-03-23T10:16:56.043 に答える
0

次のコードは、一部の人にとってはかなり興味深いものになると思います。

#include <stdio.h>
template<class X,int Y>
struct B
{
  X content;
  static const int nr=Y;
};

int main(int, char**)
{
  B<char,1> a;
  B<int,2> b;
  B<int,3> c;
  printf("%d, %d, %d\n",a.nr,b.nr,c.nr);
}
于 2011-02-09T23:28:37.627 に答える