c++模板特化链接器错误

C++ Template specialization linker error

本文关键字:链接 错误 c++      更新时间:2023-10-16

当我有模板专门化时,我如何从cpp文件分离头文件?

我看过一些关于如何通过在头文件的末尾包含cpp文件来将头文件与模板的实现分开的帖子。但是,当我必须使用模板专门化时,这种策略就不起作用了。

这是我的头文件

#ifndef H_SUM_H
#define H_SUM_H
#include <map>
#include <string>
template <typename T>
double Sum(const T &source);
template <>
double Sum(const std::map<std::string, double> &source);
#ifndef CPP_SUM_CPP
#include "Sum.cpp"
#endif
#endif

这是我的实现文件

#ifndef CPP_SUM_CPP
#define CPP_SUM_CPP 
#include "Sum.h"
template <typename T>
double Sum(const T &source){//code//}
template <>
double Sum(const std::map<std::string, double> &source){//code//}
#endif

两点:

1)如果我删除模板专门化,一切都可以正常工作

当我包含cpp文件(对于模板专门化的情况)时,代码
#ifndef CPP_SUM_CPP
#include "Sum.cpp"
#endif

是灰色的(在VC 2010中),并标记为块代码!!

任何想法?

谢谢

你的源文件只能有template<>, <>里面什么都没有,函数/方法不能部分专门化。泛型类型只能存在于头文件中。