C++ 函数模板特化导致的多重定义链接错误
来源:互联网 发布:php新闻发布系统源码 编辑:程序博客网 时间:2024/04/30 06:45
标题说的可能不是很清楚,解释一下,函数模板,一般都是放在头文件里面,所以有些时候,我也会做一个特化,也放在这个头文件里面,当这个头文件出现多次的包含之后,就会出现链接多重定义的错误,先说一个例子,如下:
现象描述
有文件"header.h"
#ifndef HEADER#define HEADERtemplate <class T>size_t size_rb_tree_node(){ return 20; /*constant value for l r p pointer and (color & height) and void * value*/}template <>size_t size_rb_tree_node<void *>(){ return 30;}#endif
"Source.cpp"
#include "Header.h"int count(){ int a = size_rb_tree_node<int>(); return a;}
"main.cpp"
#include "Header.h"using namespace std;int count();int main(){ int a = size_rb_tree_node<int>(); a = size_rb_tree_node<void *>();}
编译后,在链接的时候报错了:
1>------ Build started: Project: Win32Project1, Configuration: Debug Win32 ------1> AllocatorNew.cpp1>Source.obj : error LNK2005: "unsigned int __cdecl size_rb_tree_node<void *>(void)" (??$size_rb_tree_node@PAX@@YAIXZ) already defined in AllocatorNew.obj1>C:\Users\tianzuoz\Documents\Visual Studio 2012\Projects\Win32Project1\Debug\Win32Project1.exe : fatal error LNK1169: one or more multiply defined symbols found========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
其实原因很简单了,因为特化后的函数就是一个普通函数,这个和在一个头文件里面定义一个函数,然后多出include这个头文件一样的结果,都会导致多重定义。
解决方法
1、把特化的函数,添加inline标记,这样,编译器不会给这个函数生成一个函数符号,就当作是一个宏展开吧,不过,有些编译器不一定会inline的。行不行试试就知道了,如下:
#ifndef HEADER#define HEADERtemplate <class T>size_t size_rb_tree_node(){ return 20; /*constant value for l r p pointer and (color & height) and void * value*/}template <>inline size_t size_rb_tree_node<void *>(){ return 30;}#endif
2、让这个函数成为文件域,也就是不参与全局link,也是可以的:
#ifndef HEADER#define HEADERtemplate <class T>size_t size_rb_tree_node(){ return 20; /*constant value for l r p pointer and (color & height) and void * value*/}template <>static size_t size_rb_tree_node<void *>(){ return 30;}#endif
3、还有一个办法就是,把这个特化从头文件里面拿出去,放在需要的实现文件里面,再添加static属性。
- C++ 函数模板特化导致的多重定义链接错误
- 特化模板函数的符号多重定义错误问题解答
- 函数模板特化-编译时的重定义错误
- 函数模板的特化
- 模板函数的特化
- 函数模板的特化
- 函数模板的特化
- 函数模板的特化
- 函数模板的特化
- 【c++】模板的特化
- 链接出现多重定义错误
- C++模板定义与实现分离所导致的链接错误LNK2019
- C++:函数模板、类模板及其特化
- 用汇编的眼光看c++(之模板函数) ,(之缺省模板、特化模板) .
- 函数模板全特化与特殊的偏特化
- 模板函数和类的特化以及偏特化
- (函数/类模板)的(偏特化/全特化)
- 模板函数 链接错误
- POJ 1971 Parallelogram Counting (Hash)
- jquery的事件总结实用篇(持续更新)
- java 创建 xml文件
- Log4j 程序中动态创建多个logger 生成不同的日志文件
- cmd开放端口
- C++ 函数模板特化导致的多重定义链接错误
- 当在navigationBar的右侧添加按钮时有空隙,除掉间隔
- AndroidManifest.xml 的属性
- CListCtrl使用详解
- error code [17059]; 无法转换为内部表示
- C++:STL标准入门汇总
- ACM-水题之Digital Roots——hdu1013
- openstack cinder中的iscsitarget和tgt
- 黑马程序员-交通灯系统