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.
*/

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