2011-05-20 78 views

回答

26

VS在C++ 03上是正確的。 GCC在C++ 0x上是正確的。

現在,GCC也可以在C++ 03模式下允許這樣做(實際編譯器在C++ 03模式下不能診斷的實際上只有C++ 0x有效)而且VS在C++ 03模式下拒絕它也可能是明智的。

無論是否使用typename QualifiedName發生在模板中或不在C++ 0x中都沒有關係。也就是說,以下是完全合法的C++ 0x:

#include<vector> 

int main() { 
    typename std::vector<int> v; 
} 

在C++ 03,typename只能模板的內部使用。而你的代碼中的顯式特化不是模板。沒有template<typename T ...>子句(代碼中的所有參數都是固定的)。

+0

這是什麼意思? – Nawaz 2011-05-20 18:20:04

+0

GCC在編譯時沒有使用-std = C++ 0x'時也會出錯。 – kennytm 2011-05-20 18:25:15

+0

@KennyTM謝謝,很高興知道。你使用什麼GCC版本?我有GCC4.6.0,它接受我在C++ 03模式下的代碼示例,即使是'-pedantic'。 – 2011-05-20 18:26:40

8

根據C++ 03,typenametemplate關鍵字不允許在模板以外的任何地方使用,包括顯式(完整)模板專業化。所以MSVC++是正確的按照C++ 03

按照C++ 0x這個代碼是正確的。

3

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

14.6/5

類型名稱,應僅適用於合格的名稱關鍵字,但這些名稱不必依賴。關鍵字typename只能用於可以使用從屬名稱的上下文中。這包括模板聲明和定義,但排除顯式特殊化聲明和顯式實例化聲明。

相關問題