到目前为止,我已经进行了设置,在 header 中这样声明了某个功能模板getF
template <typename T> F* getF();
保留函数主体的不确定性。然后在共享库上,
getF
具有一些特化功能。template<>
F* getF<int>()
{
static int r = 42;
static Finstance(r);
return &Finstance;
}
template<>
F* getF<float>()
{
static float r = 3.14159;
static Finstance(r);
return &Finstance;
}
到目前为止,上面的方法已经很好地工作了,因为当在客户端可执行文件上调用
getF<float>()
时,链接器将替换为适当的引用,并且如果库中不存在特化,则编译会因链接器错误而失败(是理想的行为)但是,现在行为上应该有一个小的变化:当结果不专用于给定的模板参数时,应构建代码,但在运行时返回0。
所以我要做的就是像这样更改
getF
的声明:template <typename T> F* getF() { return 0; }
问题在于,现在编译器将在所有情况下都使用此定义,而不管库中是否存在专门化的内容
最佳答案
最好的解决方案是声明该库的显式专业存在。
// All in the same header file:
template <typename T> F* getF() { return 0; }
template <> F* getF<int>();
template <> F* getF<float>();
这满足了标准14.7.3 / 6中的规则: