2012-02-13 25 views
0
template<typename std::list<int>::value_type value> 
int silly() 
{ 
    return value; 
} 

template<typename int value> 
int silly2() 
{ 
    return value; 
} 

template<int value> 
int silly3() 
{ 
    return value; 
} 

問題1>是std::list<int>intvalue_type這些值模板參數是否相同?

Question2>這三個sillyX功能實際上是否相同?

+0

@ AJG85-雖然我同意其中的第二個是無效的,但第一個和第三個是完全合法的 - 它們是非類型的模板參數。 – templatetypedef 2012-02-13 17:42:52

+0

@templatetypedef:那麼看起來MSVC接受所有三個......雖然MSVC接受很多。第三是好的,第一和第二是看起來不應該編譯給我的東西。猜猜我錯了。 – AJG85 2012-02-13 17:53:01

+0

@ AJG85:第一個是有效的,因爲'typename'可以放在帶有* nested-name-specifier *(即'Class :: name'或'Namespace :: name')的任何名字前面。它不能放在一個不合格的類型名稱前面,所以如果沒有微軟的許多「擴展」之一,它是無效的。 – 2012-02-13 18:23:24

回答

2

答1:是的,container::value_type的類型元素的typedef它包含

答2:你silly2()因爲模板的非類型參數是病態形成不需要typename除非類型是合格的,依賴於一些類型參數

在你的第一個形式,雖然:

template<typename std::list<int>::value_type value> //you don't require typename since qualified name value_type isn't dependent, so it's avoided by compiler I guess 
int silly() 
+0

對於'傻2'VS2010不抱怨它。奇怪! – q0987 2012-02-13 17:38:44

+0

@ q0987看到這個:http://ideone.com/bAc9u,MSVS是錯誤的 – 2012-02-13 17:50:18

+0

@ q0987:該編譯器有許多「擴展」接受各種無效的代碼。如果您希望更好地編寫可移植代碼,可以選擇禁用其中的大部分選項。 – 2012-02-13 18:27:07

3

對於初學者來說,代碼

template<typename int value> 
    int silly2() 
{ 
    return value; 
} 

是不合法的,因爲不允許使用模板參數定義。您需要通過說template <int value>或通過說template <typename value>的類型參數在整數值上參數化模板。 typename被允許在第一個模板內部的原因是它使用了typename的第二個含義,即下一個名稱是一個類型。

除此之外,是的,(1)和(3)是相同的,因爲C++ ISO規範要求std::list<int>::value_typeint

希望這會有所幫助!