繁体   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