函数模板特化在头文件声明而在源文件定义为何出现了重定义错误?
template.h文件中代码
#ifndef TEMPLATE_H
#define TEMPLATE_H
#include <string>
using namespace std ;
template<typename T>
int Compare( const T & Obj1, const T &Obj2 ) ;//函数模板声明
template<>
int Compare<const char*>(const char* const& , const char* const&) ;//函数模板特化
#include "template.cpp"
#endif
template.cpp文件中代码
#ifndef TEMPLATE_CPP
#define TEMPLATE_CPP
#include <string>
#include "template.h"
using namespace std ;
//函数模板定义
template<typename T>
int Compare( const T &Obj1 , const T &Obj2 )
{
if( Obj1 < Obj2 ) return -1 ;
if( Obj2 < Obj1 ) return 1 ;
return 0 ;
}
//函数模板特化定义
template<>
int Compare<const char*>( const char* const &Obj1 , const char* const &Obj2 )
{
return strcmp( Obj1 , Obj2 ) ;
}
#endif
以上是关于模板特化的声明和定义,但是我在链接的时候出现了重定义错误:
1>LINK : 没有找到 E:\Administrator\Program Design\pieces\Primer cpp\a\Debug\a.exe 或上一个增量链接没有生成它;正在执行完全链接
1>template.obj : error LNK2005: "int __cdecl Compare<char const *>(char const * const &,char const * const &)" (??$Compare@PBD@@YAHABQBD0@Z) 已经在 main.obj 中定义
1>E:\Administrator\Program Design\pieces\Primer cpp\a\Debug\a.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
1>生成日志保存在“file://e:\Administrator\Program Design\pieces\Primer cpp\a\a\Debug\BuildLog.htm”
1>a - 2 个错误,0 个警告
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========
后来我将函数模板特化的定义放在头文件里面并且将template.cpp文件中的#include<template.h>注释掉就行了,请教各位高手帮忙分析里面的原因!
#ifndef TEMPLATE_H
#define TEMPLATE_H
#include <string>
using namespace std ;
template<typename T>
int Compare( const T & Obj1, const T &Obj2 ) ;//函数模板声明
template<>
int Compare<const char*>(const char* const& , const char* const&) ;//函数模板特化
#include "template.cpp"
#endif
template.cpp文件中代码
#ifndef TEMPLATE_CPP
#define TEMPLATE_CPP
#include <string>
#include "template.h"
using namespace std ;
//函数模板定义
template<typename T>
int Compare( const T &Obj1 , const T &Obj2 )
{
if( Obj1 < Obj2 ) return -1 ;
if( Obj2 < Obj1 ) return 1 ;
return 0 ;
}
//函数模板特化定义
template<>
int Compare<const char*>( const char* const &Obj1 , const char* const &Obj2 )
{
return strcmp( Obj1 , Obj2 ) ;
}
#endif
以上是关于模板特化的声明和定义,但是我在链接的时候出现了重定义错误:
1>LINK : 没有找到 E:\Administrator\Program Design\pieces\Primer cpp\a\Debug\a.exe 或上一个增量链接没有生成它;正在执行完全链接
1>template.obj : error LNK2005: "int __cdecl Compare<char const *>(char const * const &,char const * const &)" (??$Compare@PBD@@YAHABQBD0@Z) 已经在 main.obj 中定义
1>E:\Administrator\Program Design\pieces\Primer cpp\a\Debug\a.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
1>生成日志保存在“file://e:\Administrator\Program Design\pieces\Primer cpp\a\a\Debug\BuildLog.htm”
1>a - 2 个错误,0 个警告
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========
后来我将函数模板特化的定义放在头文件里面并且将template.cpp文件中的#include<template.h>注释掉就行了,请教各位高手帮忙分析里面的原因!
...全文
相关推荐
C++函数模板声明与定义相分离
近在仿写stl,发现stl源码中将模板的声明与定义写在一起实在很不优雅。自己尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义,然后在main函数里包含.h头文件,这样会报链接错误。这是因为函数模板要被实例化后才能成为真正的函数,在使用函数模板的源文件中包含函数模板的头文件,如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,终导致链接错误。 上面这句话有点抽象。要理解为什么会出错,首先要理解用传统方法写非模板函数时,编译器是怎么运作的。举个例子 //—————test.h——————-// void f();//这里声明一个函数f //—————test.cpp
解决C++中重定义的方法总结
本篇文章是对C++中重定义的解决方法进行了详细的分析介绍,需要的朋友参考下
C 语言变量,函数重定义问题
介绍C/c++ 开发过程中的命名规则,是重要的入门知识。
C++_关于声明,定义,类的定义,头文件作用
C++_关于声明,定义,类的定义,头文件作用
C++中头文件和源文件详细介绍
主要介绍了C++中头文件和源文件详细介绍的相关资料,需要的朋友可以参考下


