可冰

冰,是沉睡着的水......

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  37 随笔 :: 5 文章 :: 94 评论 :: 0 Trackbacks
前天碰到一个问题,当时想着挺纳闷的,不知道是什么原因.对"不能在模板声明之外使用类型名称"这样的提示你会想到是什么?我在无意中按F1键看到MSDN中的描述才明白是typename关键字用错了,是看它的英文描述才知道的:"typename cannot be used outside a template declaration".真想不到typename会翻译为类型名称.看来,以后有莫名其妙的错误还是得看英文的帮助文档啊,不过最好一开始就有英文版的VS.NET.
以下是具体的描述:


namespace code
{

enum CodeType { UTF_8, UNICODE }
;

template
< CodeType srcT, CodeType desT >

struct ConvertType{};

template
<>

struct ConvertType < UTF_8, UNICODE >
{
    typedef 
char
 srcType;
    typedef wchar_t desType;
}
;

template
< CodeType srcT, CodeType desT >

struct Convert {};

template
<>

struct Convert< UTF_8, UNICODE >
{
    
//error C2899: 不能在模板声明之外使用类型名称

    typedef typename ConvertType< UTF_8, UNICODE >::srcType srcType;    //!
    typedef typename ConvertType< UTF_8, UNICODE >::desType desType;    //!
}
;

}
 //namespace code


/*
这里根本不需要typename.
typename除用在模板声明中外,只能用于说明模板类的成员是一个类型.
例如:
template class X {};

// Another way
template struct X {
    typedef double DoubleType;

    typename X::DoubleType a;   // T::A is a type
};

而如果不是模板类,则不能用typename.这时,它并不是多余的,而是一定不能要的.
例如:
template<> struct X< X > {
    typename X::DoubleType a;    //Error! X is not a generic class
    X::DoubleType b;        //OK!
};

我前面的代码也是这样的情况,ConvertType< UTF_8, UNICODE >已经是一个具体的类了,不要是模板类,所以ConvertType< UTF_8, UNICODE >::srcType前不能加typename.
*/
posted on 2005-09-24 15:49 可冰 阅读(8837) 评论(6)  编辑 收藏 引用 所属分类: C++

评论

# re: error C2899: 不能在模板声明之外使用类型名称 ?!! 2006-03-02 17:01 yajun
这是VC得一个bug, 再VC7.1以后就可以用了。
你没有用错,是微软错了。  回复  更多评论
  

# re: error C2899: 不能在模板声明之外使用类型名称 ?!! 2006-03-02 22:57 可冰
是吗?
我没有在其它编译器下测试,只是看了它的错误说明,我还以为真是这样的呢.
我完了再试一下吧.
谢谢了!  回复  更多评论
  

# re: error C2899: 不能在模板声明之外使用类型名称 ?!! 2006-03-02 23:08 可冰
看来还是知识不过硬啊!
  回复  更多评论
  

# re: error C2899: 不能在模板声明之外使用类型名称 ?!! 2006-09-23 22:55 x
这个也不能算bug 只是vc60附带的编译器对标准支持不够 到其后的版本ms碰到“正确”的语句会说明这个市为了遵从标准 要你写个typename  回复  更多评论
  

# re: error C2899: 不能在模板声明之外使用类型名称 ?!! 2008-01-03 12:12 yangmi0313@126.com
我用VS2005怎么也有这个错误。  回复  更多评论
  

# re: error C2899: 不能在模板声明之外使用类型名称 ?!! 2015-09-29 15:45 booirror
不知道为什么,我用vs2013都出现这个问题,我觉得代码没问题。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理