包含不使用模板的函数的模板类

时间:2015-11-11 18:21:28

标签: c++ templates static-libraries

我正在跳过篮球以减少遗产。

我读了一个类似的问题here。它显示了如何使用基类解决问题。我试图放弃继承,所以我正在寻找不同的东西 - 更多的是注释。

我创建并编译了一个带有一个特化(normal)的模板类。需要模板的方法位于标题(Mixer.hpp)中。不需要模板的方法位于cpp文件(Mixer.cpp)中。当编译成静态库时,cpp部分只被编译为一个特化(Mixer<normal>)。编译器当时不知道(awsome)。将生成的静态库导入另一个项目并尝试创建不同的泛型(awsome)类会导致链接器错误,因为显然该库不包含该方法标识符(Mixer<awesome>::noTemplateInvolved)。但是,正常实现的代码与任何代码一样好,因此链接器只能链接到其他模板版本(Mixer<?dontcare?>::noTemplateInvolved)的现有源。编译器必须做的就是为链接器正确标记它。

以下是导致链接器错误的源代码:

//Target compiled to Provider.lib
//Mixer.hpp
#pragma once
#include <iostream>
using namespace std;
struct normal { static void log() { cout << "normal\n"; } };

template<typename output = normal>
class Mixer
{
public:
    void callingTemplate();
    void noTemplateInvolved();
};

template<typename output>
void Mixer<output>::callingTemplate() { output::log(); }
//Mixer.cpp
#include "Mixer.hpp"
void Mixer<>::noTemplateInvolved()
{
    cout << "noTemplateInvolved\n";
}

//Target Compiled to User.exe
//This target imports Provider.lib
#include <Provider\Mixer.hpp>
#pragma comment(lib, "Provider.lib")

struct awsome { static void log() { cout << "awsome\n"; } };

int main()
{
    Mixer<> n;
    n.callingTemplate();
    n.noTemplateInvolved();

    Mixer<awsome> a;
    a.callingTemplate();
    a.noTemplateInvolved(); //linker error here
    return 0;
}

Mixer<awsome>可以链接到方法callingTemplate,因为它的定义位于头文件中,编译器会创建该函数。在User.exe编译时,noTemplateInvolved的定义对编译器是隐藏的。编译器无法创建该方法,并且链接必须失败。

我知道有三种解决方案。

  • noTemplateInvolved的定义移至标题。
  • 包含cpp文件
  • 从基类继承

我正在寻找另一种解决方案。 noTemplateInvolved的正文实际上与模板无关。我想在标题中注释该方法。我希望编译器知道它应该始终使用相同的基本实现,无论模板如何。

那可能吗?

编辑:注释开头有点无聊的段落。

0 个答案:

没有答案