我认为你在正确的轨道上。
诀窍是:在任何一个翻译单元中,不要在您的专业化之前实例化模板。
例如:
// test.h
#ifndef TEST_H
#define TEST_H
template <typename T>
extern int variable;
template <> extern int variable<char>;
template <> extern int variable<int>;
#endif // TEST_H
然后:
// test2.cpp
#include "test.h"
template <> int variable<char> = 23;
template <> int variable<int> = 24;
最后:
// test.cpp
#include "test.h"
#include <iostream>
int
main()
{
std::cout << variable<char> << '\n';
std::cout << variable<int> << '\n';
}
对我来说,这输出:
23
24
更新
TC 在下面的评论中指出,专业化需要在首次使用之前声明,所以我已经更新了上面的“test.h”来做到这一点。
更新 2
似乎存在一些实现分歧。clang 似乎可以很好地处理这个问题:
template <typename T>
extern int variable;
template <> extern int variable<char>;
template <> extern int variable<int>;
#include <iostream>
int
main()
{
std::cout << variable<char> << '\n';
std::cout << variable<int> << '\n';
}
template <> int variable<char> = 23;
template <> int variable<int> = 24;
http://melpon.org/wandbox/permlink/DGYKvvoPbmRIHaFi
但是 gcc 给出了一个错误:
prog.cc:4:13: error: explicit template specialization cannot have a storage class
template <> extern int variable<char>;
^~~~~~
prog.cc:5:13: error: explicit template specialization cannot have a storage class
template <> extern int variable<int>;
^~~~~~
我搜索了标准和核心问题列表,但找不到任何表明一个编译器或另一个是正确的。如果有人确实看到了此类证据,我很乐意将其包含在此答案中。