C++库类的重载赋值运算符

C++ overload assignment operator of a library class

本文关键字:重载 赋值运算符 C++      更新时间:2023-10-16

我需要将 cv::Mat 分配给 cv::P oint3d

cv::Point3d pt;
cv::Mat mat(3, 1, CV_64F);
pt = mat;

我尝试以两种不同的方式做到这一点。第一次尝试如下:

template<typename _Tp>
inline cv::Point3_<_Tp> & cv::Point3_<_Tp>::operator = (const cv::Mat & mat){ ... }

但它提供了以下编译错误:

Out-of-line definition of 'operator=' does not match any declaration in 'Point3_<_Tp>'

我也尝试了这个不同的解决方案:

 template<typename _Tp>
 inline cv::Mat::operator cv::Point3_<_Tp>() const { }

但是,编译器不喜欢它,并提供以下错误:

Out-of-line definition of 'operator Point3_<type-parameter-0-0>' does not match any declaration in 'cv::Mat'

我错过了什么?

不能在

类定义之外定义赋值或转换运算符。他们必须是班级的成员。

你可以做的是提供你自己的包装类,它允许这样的赋值。像这样:

namespace mycv
{
    class Point3d
    {
    public:
        template <typename... Args>
        Point3d(Args&& ... args)
            : value(std::forward(args)...)
        {}
        Point3d& operator=(cv::Mat const& mat)
        {
            // do your stuff;
            return *this;
        }
        operator cv::Point3d() const
        {
            return value;
        }
    private:
        cv::Point3d value;
    };
}
int main(int argc, const char* argv[])
{
    mycv::Point3d pt;
    cv::Mat mat;
    pt = mat;
}