2014-10-18 46 views
1

我不明白爲什麼以下故障:模板偏特將無法正常工作

#include <cassert> 
#include <memory> 
#include <utility> 

using namespace std; 

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

template<typename... T> const char* name<T...>::value = "unknown"; 
template <> const char* name<int>::value = "int"; 
template <> const char* name<float>::value = "float"; 
template <> const char* name<template<typename,typename> class T>::value = "pair"; 

int main() 
{ 
    assert(name<int>::value == "int"); 
    assert(name<float>::value == "float"); 
    assert(name<double>::value == "unknown"); 
    assert((name<pair<int, char> >::value) == "pair"); 
} 

問題是在該行

template <> const char* name<template<typename,typename> class T>::value = "pair"; 

[temp.class.spec.mfunc]應定義這種行爲,但閱讀標準後,我仍然不明白。有人能解釋我嗎(用最清晰簡潔的方式)爲什麼這些工作都不起作用?

template <> const char* name<template<typename,typename> class T>::value = "pair"; 
template <typename T1, typename T2> const char* name<std::pair<T1,T2>>::value = "pair"; 
+0

http://stackoverflow.com/questions/26440493/template-class-specialization-with-template似乎是相同的分配,你可能會感興趣的答案有 – Mat 2014-10-18 14:39:41

+0

我首先不理解這個答案 – Dean 2014-10-18 14:40:05

+0

1.你不能部分地專門化類的成員,2.你使用無效的語法來部分專用於雙參數類模板 – 2014-10-18 14:46:12

回答

1

可以部分專業類模板,但你不能偏特一成員的類模板。這正是你想要做的事情pair事情。

爲什麼preceisely的嘗試不起作用:

template <> const char* name<template<typename,typename> class T>::value = "pair"; 

一個明確的專業化(即,不是局部特殊化)是不是一個模板。它的前綴爲template <>,完全專用模板名稱必須爲所有模板參數指定參數。所以,你可以爲這個例子做:

template <> const char* name<std::pair<int, double>>::value = "pair"; 

但是你原來的代碼是語法廢話 - 如果有的話,它看起來就像是試圖聲明模板參數列表內的兩個參數的類模板T

至於第二行:

template <typename T1, typename T2> const char* name<std::pair<T1,T2>>::value = "pair"; 

這是部分特正確的語法。不幸的是,正如我上面所說,你不能部分地專門化類模板成員,只有整個類模板。所以,你必須這樣做:

template <typename T1, typename T2> struct name<std::pair<T1,T2>> 
{ 
    static const char* value; 
}; 

template <typename T1, typename T2> const char* name<std::pair<T1,T2>>::value = "pair"; 
+0

謝謝,這是一個很好的解釋。 – Dean 2014-10-18 15:23:37