我正在跳过篮球以减少遗产。
我读了一个类似的问题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
的定义移至标题。我正在寻找另一种解决方案。 noTemplateInvolved
的正文实际上与模板无关。我想在标题中注释该方法。我希望编译器知道它应该始终使用相同的基本实现,无论模板如何。
那可能吗?
编辑:注释开头有点无聊的段落。