gcc对Template Template Parameters的兼容性
浏览:1532次 出处信息
上周有位网友联系我说chaos在他的环境上编译不过,并发给我了一些错误信息
查看了编译错误信息之后并没得到太多排查的入口,询问了对方的编译器版本是gcc 4.6.3,而我基本都是工作在4.1版本左右的gcc上,周末在家自己搭了个4.6.3的环境,果然也出现了同样的问题,之后发现这是因为高版本gcc(g++)对c++模板的检查更为严格所导致的,我们直接看例子
struct foo_t { int a; }; template< typename T, template< typename T2 > class C > class cc_t { private: C< T > m_c; }; int main() { cc_t< foo_t*, std::priority_queue > cc; return 0; }
这里的cc_t类使用了模板参数嵌套模板(template template parameters)的用法,C作为一个模板容器类,T作为数据类型,然后我们在main函数中传入foo_t*数据类型和std::priority_queue,在4.1.3的g++版本中可以很和谐地编译通过,但是在4.6.3的版本中,编译器报出如下错误:
main.cpp: In function 'int main()':
main.cpp:20:39: error: type/value mismatch at argument 2 in template parameter list for 'template class C> class cc_t'
main.cpp:20:39: error: expected a template of type 'template class C', got 'template class std::priority_queue'
main.cpp:20:43: error: invalid type in declaration before ';' token
意思很明确,stl的priority_queue的模板参数具有三个参数,但后两个参数(_Sequence, _Compare)stl都提供了默认模板参数,我们在常规使用时可以不用指定,但这里4.6.3的g++编译器对模板参数嵌套模板的语法加强了类型检测,会导致编译不过
我的解决方案也简单
struct foo_t { int a; }; template< typename T, template< typename T2 > class C > class cc_t { private: C< T > m_c; }; templateclass pq_t : public priority_queue { }; int main() { cc_t< foo_t*, pq_t > cc; return 0; }
多增加一个pq_t类作为适配,这样即能编译通过
在
和
中都出现了这样的问题,现已通过增加适配类的方式解决,如果大家有更好的方案希望指教
最后吐槽,要做具备兼容性或跨平台的东西坑还真多
建议继续学习:
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:linux时间相关结构体和函数整理
后一篇:lua metatable使用和源码分析(一) >>
文章信息
- 作者:yunjie 来源: Yunjie Blog
- 标签: gcc
- 发布时间:2012-08-15 13:39:40
近3天十大热文
- [52] IOS安全–浅谈关于IOS加固的几种方法
- [52] 图书馆的世界纪录
- [51] 如何拿下简短的域名
- [50] android 开发入门
- [49] Go Reflect 性能
- [49] Oracle MTS模式下 进程地址与会话信
- [47] 【社会化设计】自我(self)部分――欢迎区
- [45] 读书笔记-壹百度:百度十年千倍的29条法则
- [37] 程序员技术练级攻略
- [29] 视觉调整-设计师 vs. 逻辑