[英]typename outside of template
這在VS2010sp1中沒有編譯(雖然它使用gcc 4.6進行編譯):
template<class T>
struct Upcast;
template<>
struct Upcast<signed char>
{
typedef signed short type;
};
template<>
struct Upcast<char>
{
typedef typename std::conditional<std::is_signed<char>::value,short, unsigned short>::type type;
};
int main()
{
Upcast<char>::type a;
return 0;
}
來自VS的錯誤:
Error 1 error C2899: typename cannot be used outside a template declaration
哪支隊伍是對的? VS還是gcc?
VS在C ++ 03上是正確的。 GCC在C ++ 0x上是正確的。
現在,GCC也可以在C ++ 03模式中允許這種情況(實際編譯器在C ++ 03模式中沒有很多東西實際上只在C ++ 0x中有效),它可能是-well對於在C ++ 03模式下拒絕它是明智的。
在C ++ 0x中,是否在模板中使用typename QualifiedName
並不重要。 也就是說,以下內容對於C ++ 0x來說是完全合法的:
#include<vector>
int main() {
typename std::vector<int> v;
}
在C ++ 03中, typename
只能在模板中使用。 並且代碼中的顯式特化不是模板。 沒有template<typename T ...>
子句(代碼中的所有參數都是固定的)。
根據C ++ 03, template
外的任何地方都不允許使用typename
和template
關鍵字,包括顯式(完整)模板特化。 因此,根據C ++ 03,MSVC ++是正確的
根據C ++ 0x,這段代碼是正確的。
在這種特殊情況下,似乎VS2010拒絕代碼是正確的:
14.6 / 5
關鍵字typename只能應用於限定名稱,但這些名稱不必相關。 關鍵字typename只能在可以使用從屬名稱的上下文中使用。 這包括模板聲明和定義,但不包括顯式特化聲明和顯式實例化聲明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.