如何管理变量模板的显式特化?

我在标题中:

// foo.h
#pragma once
template<typename T> extern T minBound;

在附近的一个编译单元中:
// foo.cpp
#include "foo.h"
template<> int minBound<int> = 0x80000000;
template<> short minBound<short> = 0x8000;

还有一个主要的:
// main.cpp
#include <iostream>
#include "foo.h"

int main() {
    std::cout << minBound<int> << std::endl; // Hopefully -2147483648
    std::cout << minBound<short> << std::endl; // Hopefully -32768
    return 0;
}

g++ *.cpp编译。

链接器告诉我我有multiple definition of minBound<int>multiple definition of minBound<short>。可变模板不能是外部的吗?我想到的是各种模板特化的不同值(value)。我将如何去实现这一目标?

我使用的是Ubuntu 18.04.1,gcc版本7.4.0。使用GCC 7.4和8.3在WSL上进行了测试;没有任何问题。

我知道我可以使其成为零参数函数,但这很无聊。

最佳答案

任何显式专门化都类似于普通函数,因为它必须在使用的所有位置(即在 header 中)声明,并在一个源文件中定义。对于变量模板,非定义声明包含extern,就像其他任何变量一样。但是,GCC似乎不支持此功能(每个Wandbox)。

09-06 15:11