首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板外部的typename

模板外部的typename
EN

Stack Overflow用户
提问于 2011-05-21 02:11:11
回答 3查看 10.2K关注 0票数 20

这在VS2010sp1中是不能编译的(但是在gcc 4.6中是可以编译的):

代码语言:javascript
复制
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的错误:

代码语言:javascript
复制
Error   1   error C2899: typename cannot be used outside a template declaration

哪一队是对的?VS还是gcc?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-21 02:18:57

VS就在C++03上。GCC在C++0x上说得很对。

现在,对于GCC来说,在C++03模式下也允许这样做可能是明智的(在C++03模式下,许多真正的编译器不能诊断的东西实际上只在C++0x中有效),对于VS来说,在C++03模式下拒绝它也可能是明智的。

在C++0x中,是否在模板中使用typename QualifiedName已经不再重要了。也就是说,以下内容对于C++0x来说是完全合法的:

代码语言:javascript
复制
#include<vector>

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

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

票数 26
EN

Stack Overflow用户

发布于 2011-05-21 02:19:56

根据C++03,typenametemplate关键字不允许在模板之外的任何地方使用,包括显式(完整)模板专门化。因此根据C++03,MSVC++是正确的

根据C++0x,此代码是正确的。

票数 8
EN

Stack Overflow用户

发布于 2011-05-21 02:26:22

在这种特殊情况下,VS2010拒绝代码似乎是正确的:

14.6/5

关键字typename应仅应用于限定名称,但这些名称不必是依赖的。关键字typename只能在可以使用依赖名称的上下文中使用。这包括模板声明和定义,但不包括显式专门化声明、和显式实例化声明。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6076015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档