免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1961 | 回复: 4
打印 上一主题 下一主题

c++模板移植总结 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-02 09:18 |只看该作者 |倒序浏览
这几天把windows下vc6写的c++程序移植到Linux,碰到了一些问题,尤其是模板的问题,大概是因为vc6对模板支持不是很标准,在linux下g++报了很多错误,奋斗了一天,终于全部解决了,总结了一下,希望对大家有帮助。

(1) 关键字 typename vs class

  在模板定义时的class和typename是没有区别的,因为最初发明模板时决定使用class以减少一个关键字,但后来发现还是不得不加上typename关键字,参见如下代码:

template<class C>   
void f(C & rc)   
{   
  typename C::iterator  i  =  rc.begin();   
  //   ...   

}  


编译器不知道C的定义,所以不知道C::iterator是什么东西,此处必须有typename来告诉编译器,而不能使用class关键字。在Windows的vc6环境下,typename可以省略,编译器自动识别补全,但在Linux的gcc编译时,提示需要添加typename。

(2) 静态变量初始化

以下代码演示了多类型的静态变量初始化。
template  <typename T>
class Image
{
  public:
    static const int flag;
  // ...

};

const int Image<int>::flag = 10;
const int Image<float>::flag = 15;



上面的代码,在vc6和gcc 3.2.2下均能编译通过,但在新版gcc4.2.3下出现编译器内部错误,需要采用如下方式初始化:

template <> const int Image<int>::flag = 10;
template <> const int Image<float>::flag = 15;

论坛徽章:
0
2 [报告]
发表于 2008-09-02 09:21 |只看该作者
大家还有什么其它方面,补充一下

论坛徽章:
0
3 [报告]
发表于 2008-09-02 09:54 |只看该作者
其实很简单
不是移植出了问题
实际上应该是你的平时的写代码的习惯不好
你如果试试vs2005就应该不会出现那些问题了,这实际上都是一些c++标准的实现问题

论坛徽章:
0
4 [报告]
发表于 2008-09-02 11:40 |只看该作者

回复 #3 ztz0223 的帖子

恩,c++的模板实现一直在改变,即使gcc的不同版本也不同

论坛徽章:
0
5 [报告]
发表于 2008-09-03 21:07 |只看该作者
楼主真是好人啊,我曾经也遇到类似的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP