【发布时间】:2015-08-30 02:00:43
【问题描述】:
当我有模板专业化时,如何将头文件与 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 中)并被标记为块代码!!!
有什么想法吗?
谢谢
【问题讨论】:
-
首先,除非您真的知道自己在做什么,否则请停止尝试使用预处理器指令和implement your templates in header files where they belong 玩曲棍球。据我所知,
Sum.cpp甚至不应该存在。 -
我正在学习 C++ 中的模板。我知道在这种情况下,没有必要拥有 cpp 文件。但这是项目的一部分,我们被要求将它们写在单独的文件中。
-
这不是必要的问题;这甚至是一个适当的问题。谁告诉你要认真做,应该阅读我提供的链接以及其中的答案。最终显示的“策略”,如果它有效,就编译器而言,它并不比首先在头文件中实现更好。因此,您获得的唯一好处是容易损坏的东西(它有)。无论如何,您的
Sum.cpp不在作为项目的一部分构建的文件中,对吗?什么包括Sum.h失败?这看起来更像是重载而不是专业化。 -
感谢您的回复。我仔细检查了一下,似乎我们的项目除了 hpp 文件之外确实没有必要拥有 cpp 文件!我听从您的建议并将所有内容包含在头文件中。至少我最终阅读了一些有趣的帖子......感谢链接。
标签: c++ templates specialization