我的模板专业化有什么问题?

What is wrong with my template specialization?

我想提供几个转换函数,将我的自定义结构转换为其他类型。这些函数应该被 return return 类型重载。我试过如下的模板专业化。

我收到此编译器错误消息:

class cv::Rect __cdecl convert<class cv::Rect >(struct MyRect const &)" already defined in CallerCode.obj.

我的代码有什么问题?

MyRect.h

struct MyRect
{
    float lux, luy, rlx, rly;

    float width() const;
    float height() const;
};

图书馆代码

class cv::Rect;
struct OtherRect;

Conversion.h

template<typename T> T convert(const MyRect& r);

template<> cv::Rect convert<cv::Rect>(const MyRect& r)
{
    return cv::Rect(r.lux, r.luy, r.width(), r.height());
}

template<> OtherRect convert<OtherRect>(const MyRect& r)
{
    return OtherRect(r.lux, r.luy, r.rlx, r.rly);
}

调用代码

MyRect r{ 0.f, 0.f, 0.f, 0.f };
const cv::Rect cr = convert<cv::Rect>(r);

完全特化不再是模板函数,因此不再隐式 inline

你必须添加inline

template<> inline cv::Rect convert<cv::Rect>(const MyRect& r)
{
    return cv::Rect(r.lux, r.luy, r.width(), r.height());
}

或拆分头文件中的声明和 cpp 文件中的定义

// Declaration: in header
template<> cv::Rect convert<cv::Rect>(const MyRect&);
// Definition: in cpp file
template<> cv::Rect convert<cv::Rect>(const MyRect& r)
{
    return cv::Rect(r.lux, r.luy, r.width(), r.height());
}