Chinaunix首页 | 论坛 | 博客
  • 博客访问: 179947
  • 博文数量: 27
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 285
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-20 10:21
个人简介

6年的blog,重新拾起,再来耕耘!

文章分类

全部博文(27)

文章存档

2013年(1)

2009年(9)

2007年(17)

我的朋友

分类: C/C++

2009-05-14 15:51:01

转自:VC6升级到.net的编译问题:warning C4346: “stree::const_iterator” : 依赖名称不是类型
将VC6.0的代码移植到DotNet如果代码中使用了template,则有可能发生如下错误:
见示例工程:http://files.cnblogs.com/kusamba/HListTest.rar
e:\Test\HListTest\hList.h(544) : warning C4346: “hList::iterator” : 依赖名称不是类型
        用“typename”为前缀来表示类型
e:\Test\HListTest\hList.h(544) : error C2143: 语法错误 : 缺少“;”(在“hList::push_back”的前面)
e:\Test\HListTest\hList.h(544) : error C2501: “hList::iterator” : 缺少存储类或类型说明符
e:\Test\HListTest\hList.h(544) : warning C4346: “hList::push_back” : 依赖名称不是类型
        用“typename”为前缀来表示类型
e:\Test\HListTest\hList.h(544) : error C2143: 语法错误 : 缺少“,”(在“&”的前面)
出错代码如下:
(1)template< typename TYPE, typename KEYTYPE, typename HASHGEN >
(2)hList::iterator
(3)hList::push_back( const TYPE& Item ) <----提示出错!
{
...
}
解决方法:
在第(2)行前添加关键词:typename
原因:
DotNet编译器将所有可以识别的符号认为是一个“value”(使用typename,  class限定除外)
msdn对此如下解释:

编译器警告(等级 1)C4346
“name”: 依赖名称不是类型
如果依赖名称将被视为一个类型,则 typename 关键字是必需的。这是在 Visual C++ .NET 2003 编译器中进行的重大更改,以便符合 ISO C++ 标准。
有关更多信息,请参见编译时的重大更改摘要。
为使代码在 Visual C++ 的所有版本中以同样方式工作,请将 typename 添加到声明中。
下面的示例生成 C4346:
// C4346.cpp
// compile with: /WX /LD
template
struct C {
T::X* x;   // C4346
// try the following line instead
// typename T::X* x;
};
阅读(2049) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~