C++ c++;:OpenCV::Mat::at无法分配给常量变量

C++ c++;:OpenCV::Mat::at无法分配给常量变量,c++,opencv,C++,Opencv,以 class T { public: Mat D; void operator()(double &p, const int * pos) const { D.at<double>(pos[0]*2 + 1, 1) = p; } T(Mat D); }; T类{ 公众: matd; void运算符()(双p,常量int*pos)常量{ D.at(位置[0]*2+1,1)=p;

class T {
    public:
        Mat D;
        void operator()(double &p, const int * pos) const {
            D.at<double>(pos[0]*2 + 1, 1) = p;
        }
        T(Mat D);
};
T类{
公众:
matd;
void运算符()(双p,常量int*pos)常量{
D.at(位置[0]*2+1,1)=p;
}
T(matd);
};
导致编译错误“cv::Mat::at”:不能将其赋值给常量变量。构造函数只指定D作为参数

D移动到全局范围可以修复错误,但这当然不是首选。这就引出了两个问题:

  • 错误的来源是什么,可以解决吗
  • 有没有更好的方法将变量传递到函子的作用域中
  • 对于第二点,为了清楚起见,应该注意函子将在
    Mat::forEach
    中使用,因此将附加变量作为参数传递不是一个选项

    void operator()(double &p, const int * pos) const
    
    是一个
    const
    函数。这意味着在函数体内,所有类成员都被视为
    const
    。由于您想要变异
    D
    您有几个选项,您可以删除
    const
    ,您可以将
    D
    声明为
    mutable
    ,以便对其进行修改,或者您可以将
    D
    作为一个参考成员,如

    class T {
        public:
            Mat& D;
            void operator()(double &p, const int * pos) const {
                D.at<double>(pos[0]*2 + 1, 1) = p;
            }
            T(Mat& D) : D(D);
    };
    
    T类{
    公众:
    Mat&D;
    void运算符()(双p,常量int*pos)常量{
    D.at(位置[0]*2+1,1)=p;
    }
    T(Mat&D):D(D);
    };
    
    这是因为引用被标记为
    const
    (这意味着什么都没有,因为引用不能被重新分配),而不是它所引用的内容

    是一个
    const
    函数。这意味着在函数体内,所有类成员都被视为
    const
    。由于您想要变异
    D
    您有几个选项,您可以删除
    const
    ,您可以将
    D
    声明为
    mutable
    ,以便对其进行修改,或者您可以将
    D
    作为一个参考成员,如

    class T {
        public:
            Mat& D;
            void operator()(double &p, const int * pos) const {
                D.at<double>(pos[0]*2 + 1, 1) = p;
            }
            T(Mat& D) : D(D);
    };
    
    T类{
    公众:
    Mat&D;
    void运算符()(双p,常量int*pos)常量{
    D、 at(位置[0]*2+1,1)=p;
    }
    T(Mat&D):D(D);
    };
    

    这是因为引用被标记为
    const
    (这意味着什么,因为引用不能被重新分配),而不是它所指的内容。

    通过引用保持
    Mat
    D。通过引用保持
    Mat
    D