我只是想知道: 可以在标题中声明模板函数(不是成员函数),例如:
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)
{
}
我试图不使用专门的课程。
答案 0 :(得分:0)
您需要在标题中声明您的专精:
template<>
ImageRgbT f<ImageRgbT>(const cv::Mat & inMat);
否则,根据[temp.expl.spec] / 6,您的程序是格式错误的NDR:
如果模板,成员模板或类模板的成员是明确专用的,则应在首次使用该特化之前声明该特化,这将导致隐式实例化 在发生此类使用的每个翻译单位中进行;无需诊断。
违反此规则可能导致编译器在一个转换单元中为f<ImageRgbT>
发出一个定义,从主模板实例化,在转换单元中包含显式特化的另一个定义,从而导致链接器出现问题。它似乎只适用于你的情况,因为你很幸运,因为不需要诊断。
如果标题中的声明了 ,那么在单独的文件中定义就没有问题。