有一个C ++头库,但在某些时候已经添加了模板特化(在标题中)。 一切都很好,直到需要链接两个使用此库的文件。当然,存在链接器错误。 问题是库的类使用静态变量。它们直接在头文件中初始化为模板特化。
问题是:是否可以在头文件中初始化模板特化的静态变量,并以某种方式避免链接错误? (类似于为具有类似链接问题的模板类方法专业化添加内联关键字。)
欢迎任何想法(包括肮脏的技巧等)。
一些代码示例:
lib.hpp:
template <typename T>
struct LibClass
{
static const int variable;
static void f()
{
// use variable
}
};
typedef LibClass<int> IntLibClass;
template <> const int IntLibClass::variable = 0;
typedef LibClass<double> DoubleLibClass;
template <> const int DoubleLibClass::variable = 1;
A.cpp:
#include "lib.hpp"
void g()
{
IntLibClass a;
a.f();
}
B.cpp:
#include "lib.hpp"
void h()
{
DoubleLibClass b;
b.f();
}
int main()
{
h();
}
我希望链接A和B在一起。
g++ A.cpp B.cpp
答案 0 :(得分:0)
只需在项目中添加附加文件lib.cpp
,其中包含以下内容:
#include "lib.hpp"
template <> const int IntLibClass::variable = 0;
template <> const int DoubleLibClass::variable = 1;
并按以下方式更改lib.hpp
文件(删除初始化):
typedef LibClass<int> IntLibClass;
template <> const int IntLibClass::variable;
typedef LibClass<double> DoubleLibClass;
template <> const int DoubleLibClass::variable;
作为注释中注释的Johannes Schaub - litb,此解决方案意味着头文件中没有初始化静态变量(因为问题中需要),因此变量值不能用于常量表达式(在{之外) {1}}文件)。
但是这个解决方案适用于问题中给出的代码片段。