假设 data.h 中有一个模板变量:
template <class T>
struct Data
{
Data() = delete;
Data(T initValue) : value(initValue){}
T value;
};
template<class T>
extern Data<T> data;
在 data_def.cpp 中有一个针对
int
的变量的专门化定义:
#include "data.h"
template<>
Data<int> data<int>{55};
main.cpp中的用法:
#include <iostream>
#include "data.h"
int main() {
std::cout << data<int>.value << "\n";
return 0;
}
代码可以在 GCC 上运行,但 clang 抱怨:
警告:此处需要实例化变量“数据”,但没有可用的定义 [-Wundefined-var-template]。
可能它需要模板变量特化的声明。
在一个翻译单元中定义模板变量专业化并在不同的翻译单元中使用它的正确方法是什么(根据标准)? 如果需要声明变量专门化,其语法是什么? 在标准中我没有找到答案。
我只能使用 C++17(如果重要的话)。
诱人的语法
template<> extern Data<int> data<int>;
是错误的(GCC 不接受它,而 clang 开发者也会这样做)如果需要声明变量专门化,其语法是什么?
您可以在头文件中的专业化定义中使用
inline
。这样您就不需要在单独的源文件中定义它。 演示
将 data.h 更改为:
#pragma once
template <class T>
struct Data
{
Data() = delete;
Data(T initValue) : value(initValue){}
T value;
};
template<class T>
extern Data<T> data;
//---------vvvvvv--------------------------inline added here
template<> inline Data<int> data<int>{55};