标头中模板特化的静态变量初始化

时间:2014-03-10 15:16:37

标签: c++ templates static-methods template-specialization static-variables

有一个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

1 个答案:

答案 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}}文件)。

但是这个解决方案适用于问题中给出的代码片段。