2016-11-17 43 views
1

私はTag Dispatchingを実装するために使用し、次のコードがあります。未解決の外部シンボル

template <class T> struct tag 
{ 
    typedef struct {} type; 
    static const type value; 
}; 

を私はその後、いくつかの理由のための関数のオーバーロードされたバージョンを提供するためのいくつかの定義では、この構造体を使用し、あいまいである可能性があります。たとえば、私はの単一のパラメータを取るunarchive関数のセットを持っています。次の型は、使用するオーバーロードされたバージョンを決定するために型特性を使用し、したがってどの型を解凍するかを決定します。

packet HYP_NAMESPACE unarchive(unarchiver ar, typename tag<packet>::type) 
{ 
    // Code here 
} 

これがそうのように呼び出すことができます:ここでは、パケットunarchives例です

unarchive(ar, tag<packet>::value); 

このコードは、gccと打ち鳴らすの両方で正常に動作しますが、私がちょうど束を得るVS 2015で失敗しています

LNK2001未解決の外部シンボル "パブリック:静的構造体タグ::型のconstタグ::値"(?値@ $タグ@ G @@ 2Utype B @ 12 @)

ようなエラーの

struct tagの宣言は、それ自身のヘッダ(.h)にあり、実装はすべての実装ファイル(.cpp)に表示されます。誰かがこれの原因を特定できますか?

+0

ここで、静的メンバー変数を明示的に定義していますか? – Jonas

+0

うん..それは考えていませんでした。私はしません。この場合、私は初期化に特定の値を必要としません。ゴミが含まれていれば、それはうまくいくはずです。あなたはそれがエラーの原因だと思いますか? –

答えて

1

static const type value;は、静的メンバー変数valueの宣言であり、変数が他のどこかで定義されることを約束します。

これはtemplate <class T> const typename tag<T>::type tag<T>::value;の定義です。

定義は、単に初期化以外のものです。

+0

ありがとうございました。実際、私は変数の初期化を覚えていませんでした。私がすべてを信じさせてくれたclangとgcc(私の最初の目標)がこれをどのようにうまく使っているのか、面白かったです。 –

+0

はい、両方のコンパイラは多くの場合、定義なしで静的メンバー変数を受け入れます。しかし、あなたが気づいたように、それはとても移植性がありません。 – Jonas

+0

私は通常、gccとclangだけを使用するので、これは私には不思議に思っています。今修正されました。 –