到目前为止,我已经进行了设置,在 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中的规则:

08-17 03:22