cpp中的C ++模板化函数重载

时间:2017-10-27 22:35:02

标签: c++ templates

我只是想知道: 可以在标题中声明模板函数(不是成员函数),例如:

template<class I>
inline I f(const cv::Mat & inMat)
{
   throw(std::logic_error("No override found for this type of image"));
}

然后,定义cpp文件中允许的内容,如下所示:

template<>
ImageRgbT f<ImageRgbT>(const cv::Mat & inMat)
{
}

我试图不使用专门的课程。

1 个答案:

答案 0 :(得分:0)

您需要在标题中声明您的专精:

template<>
ImageRgbT f<ImageRgbT>(const cv::Mat & inMat);

否则,根据[temp.expl.spec] / 6,您的程序是格式错误的NDR:

  

如果模板,成员模板或类模板的成员是明确专用的,则应在首次使用该特化之前声明该特化,这将导致隐式实例化   在发生此类使用的每个翻译单位中进行;无需诊断。

违反此规则可能导致编译器在一个转换单元中为f<ImageRgbT>发出一个定义,从主模板实例化,在转换单元中包含显式特化的另一个定义,从而导致链接器出现问题。它似乎只适用于你的情况,因为你很幸运,因为不需要诊断。

如果标题中的声明了 ,那么在单独的文件中定义就没有问题。