函数模板特化在头文件声明而在源文件定义为何出现了重定义错误?
春起之苗 2013-01-23 03:47:41 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>注释掉就行了,请教各位高手帮忙分析里面的原因!