2016-11-17 77 views
1

我有下面的代碼,我用實施Tag Dispatching解析外部符號traits模板類

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

然後我用這個結構在幾個定義提供的功能重載版本是,由於某種原因,可能會含糊不清。例如,我有一組unarchive函數,它們採用單個參數unarchiver ar。下面的類型使用類型特徵來決定要使用的重載版本,從而確定要取消歸檔的類型。下面是解檔包的例子:

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

這可以被稱爲像這樣:

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

此代碼工作正常GCC和鐺,但它的失敗在VS 2015年我剛剛得到了一堆

LNK2001解析的外部符號 「公用:靜態結構標籤:: const類型標籤::值」(?值@ $ @標籤@@ g^@ 2Utype 12 @ B)

樣的錯誤

struct tag聲明在它自己的頭文件(.h)中,並且這些用法在整個實現(.cpp)文件中出現。任何人都可以找出這個原因嗎?

+0

你在哪裏明確定義了你的靜態成員變量? – Jonas

+0

嗯..沒有想到這一點。我不。在這種情況下,我不需要一個特定的初始化值,如果它包含垃圾,它應該沒問題。你認爲這是導致錯誤? –

回答

1

這個:static const type value;是靜態成員變量value的聲明,它是一個promis變量將被定義在其他地方。

這個:template <class T> const typename tag<T>::type tag<T>::value;是一個定義。

該定義不僅僅是初始化。

+0

謝謝喬納斯。事實上,我不記得初始化變量。有趣的是,它如何與clang和gcc(我的最初目標)一起工作,這使我相信一切都是好的。 –

+0

是的,這兩個編譯器在很多情況下都會接受靜態成員變量而沒有定義。但是,正如你所注意到的那樣,它不是很便攜。 – Jonas

+0

明白了!我通常只使用gcc和clang,所以這讓我感到疑惑。現在已經修復了。 –