如何管理变量模板的显式特化?
我在标题中:
// 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)。