当我有模板特化时,如何将头文件与 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) 如果我删除模板特化,一切正常
2) 当我包含 cpp 文件时(对于模板特化的情况)代码
#ifndef CPP_SUM_CPP
#include "Sum.cpp"
#endif
为灰色(在 VC 2010 中)并标记为 block 代码!
有什么想法吗?
谢谢
最佳答案
你的源文件只能有template<>
,里面什么都没有 <>
, 函数/方法不能部分特化。通用类型只能存在于头文件中。
关于C++ 模板特化链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32292476/