error C2899: 不能在模板声明之外使用类型名称 ?!!

error C2899: 不能在模板声明之外使用类型名称 ?!!

前天碰到一个问题,当时想着挺纳闷的,不知道是什么原因.对"不能在模板声明之外使用类型名称"这样的提示你会想到是什么?我在无意中按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.
*/

评论

#  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 [email protected]
我用VS2005怎么也有这个错误。  回复  更多评论

posted on 2008-08-31 21:48 肥仔 阅读(1167) 评论(0)  编辑 收藏 引用 所属分类: C++ 模板

你可能感兴趣的:(error C2899: 不能在模板声明之外使用类型名称 ?!!)