【问题标题】:C++ Template specialization linker errorC++ 模板特化链接器错误
【发布时间】: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


【解决方案1】:

你的源文件只能有template&lt;&gt;&lt;&gt;里面什么都没有,函数/方法不能部分特化。泛型类型只能存在于头文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 2018-08-19
    • 1970-01-01
    • 2015-01-21
    • 2011-07-24
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多