模板外的typename

The*_* do 20 c++ templates

这在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;
}
Run Code Online (Sandbox Code Playgroud)

来自VS的错误:

Error   1   error C2899: typename cannot be used outside a template declaration
Run Code Online (Sandbox Code Playgroud)

哪支队伍是对的?VS还是gcc?

Joh*_*itb 26

VS在C++ 03上是正确的.GCC在C++ 0x上是正确的.

现在,GCC也可以在C++ 03模式中允许这种情况(实际编译器在C++ 03模式中没有很多东西实际上只在C++ 0x中有效),它可能是-well对于在C++ 03模式下拒绝它是明智的.

typename QualifiedName在C++ 0x中,无论是否在模板中使用都无关紧要.也就是说,以下内容对于C++ 0x来说是完全合法的:

#include<vector>

int main() {
  typename std::vector<int> v;
}
Run Code Online (Sandbox Code Playgroud)

在C++ 03中,typename只能在模板中使用.并且代码中的显式特化不是模板.没有template<typename T ...>子句(代码中的所有参数都是固定的).


Pra*_*rav 8

按照C++ 03,typenametemplate关键字没有在任何一个模板超出允许的,包括明确的(全)模板特.因此,根据C++ 03,MSVC++是正确的

根据C++ 0x,这段代码是正确的.