我有一個類模板name
來檢測類型名稱。它適用於簡單類型,如int
,float
。但是,對於某些模板類型(如std:pair
),編譯器(VS2013)會在我嘗試定義其靜態成員變量時在行上報告錯誤。帶模板的類模板專業化
#include <cassert>
#include <memory>
using namespace std;
template<class T> struct name{ static const char* value; };
template<class T> const char* name<T>::value = "unknown";
template<> const char* name<int>::value = "int";
template<> const char* name<float>::value = "float";
template<class T1, class T2> const char* name<pair<T1, T2> >::value = "pair"; //compilation error
void main()
{
assert(name<int>::value == "int");
assert(name<float>::value == "float");
assert(name<double>::value == "unknown");
assert((name<pair<int, char> >::value) == "pair");
}
如果我用以下四行替換該行,該程序按預期工作。
template<class T1, class T2> struct name < pair<T1, T2> > {
static const char* value;
};
template<class T1, class T2> const char* name<pair<T1, T2> >::value = "pair";
但這種方式看起來很醜,由於一些重複的代碼。有什麼方法可以四處走動嗎?
更新已修復了一些明顯符合標準的問題。
很難甚至開始枚舉所有的都錯了,此代碼的東西,而是專心於手頭的問題:你只能專注靜態數據成員明確,但不能部分。 – 2014-10-18 14:24:52
對不起,你正在使用這樣一個可怕的編譯器,你不知怎麼就想到你的代碼是遠程正確的。幾乎每一行都有嚴重的錯誤,我責怪編譯器欺騙你認爲這是好的。 – 2014-10-18 14:25:45
你應該使'static const char * const值'類型 – 2014-10-18 14:27:01