可冰

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

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  37 随笔 :: 5 文章 :: 94 评论 :: 0 Trackbacks
<2006年3月>
2627281234
567891011
12131415161718
19202122232425
2627282930311
2345678

公告


My blog is worth ¥0.00.


品味孤独......


 冰,是沉睡着的水.
 而我,却是内部含有未结冰之水的冰.外表看来似乎冰冷,而内心却犹如水一般,柔和.

这样的一块冰,
  似睡非睡,似醒非醒......
  似强非强,似弱非弱......
  似刚非刚,似柔非柔......


剑如飞 心如水
也隔不断相思泪
歌不悔 心还醉
究竟是为谁

爱若苦 心无顾
谁拿爱情一生赌
翅断了 碟儿飞了
化作一世深缘故


黄金色的树林里分出两条路,
可惜我们不能同时去涉足,
但我们却选择了,
人迹罕至的那一条,
这从此决定了
我们的一生.

常用链接

留言簿(7)

随笔分类(18)

随笔档案(37)

文章分类(5)

文章档案(5)

相册

朋友的博客

收藏

我的博客组

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

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