我的模板专业化有什么问题?
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());
}
我想提供几个转换函数,将我的自定义结构转换为其他类型。这些函数应该被 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());
}