访问模板变量特化的正确语法

问题描述 投票:0回答:1

假设 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;
}

godbolt 上的完整项目

代码可以在 GCC 上运行,但 clang 抱怨: 警告:此处需要实例化变量“数据”,但没有可用的定义 [-Wundefined-var-template]。
可能它需要模板变量特化的声明。

在一个翻译单元中定义模板变量专业化并在不同的翻译单元中使用它的正确方法是什么(根据标准)? 如果需要声明变量专门化,其语法是什么? 在标准中我没有找到答案。


我只能使用 C++17(如果重要的话)。
诱人的语法

template<> extern Data<int> data<int>;
是错误的(GCC 不接受它,而 clang 开发者也会这样做)
更新:
@Oersted 和 @user12002570 建议使用内联 WA。这不是一个完整的解决方案,而是一个有效的 WA

c++ templates c++17
1个回答
1
投票

如果需要声明变量专门化,其语法是什么?

您可以在头文件中的专业化定义中使用

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};

© www.soinside.com 2019 - 2024. All rights reserved.