簡體   English   中英

模板外的typename

[英]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外的任何地方都不允許使用typenametemplate關鍵字,包括顯式(完整)模板特化。 因此,根據C ++ 03,MSVC ++是正確的

根據C ++ 0x,這段代碼是正確的。

在這種特殊情況下,似乎VS2010拒絕代碼是正確的:

14.6 / 5

關鍵字typename只能應用於限定名稱,但這些名稱不必相關。 關鍵字typename只能在可以使用從屬名稱的上下文中使用。 這包括模板聲明和定義,但不包括顯式特化聲明和顯式實例化聲明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM