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

C++ templated function overload in cpp

本文关键字:函数 重载 C++ cpp      更新时间:2023-10-16

我只是想知道:在诸如之类的头中声明模板函数(而不是成员函数)可以吗

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)
{
}

我尽量不使用专业课。

您需要在标头中声明您的专业化:

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

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

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

违反此规则可能导致编译器在一个翻译单元中为f<ImageRgbT>发出一个定义(从主模板实例化),在包含显式专用化的翻译单元中发出另一个定义,从而导致链接器故障。它似乎只在你的情况下起作用,因为你很幸运,而且不需要诊断。

如果专用化是在标头中声明的,那么在单独的文件中定义就没有问题。