非静态成员参考

时间:2013-11-04 07:27:03

标签: c++ visual-studio-2010 opencv

我的代码中出现错误: -

int main() {

cv::Mat image = imread("file.jpg", CV_LOAD_IMAGE_GRAYSCALE);
uint8_t* pixelPtr = (uint8_t*)image.data;
int cn = image.channels();
 for(int i = 0; i < image.rows; i++)
{
    for(int j = 0; j < image.cols; j += cn)
    {
        typedef Scalar_<uint8_t> bgrPixel;
        bgrPixel.val[0] = pixelPtr[i*image.cols*cn + j*cn + 0]; // B
        bgrPixel.val[1] = pixelPtr[i*image.cols*cn + j*cn + 1]; // G
        bgrPixel.val[2] = pixelPtr[i*image.cols*cn + j*cn + 2]; // R

    // do somethin
    }
}
}

VS10强调val [0]并且表示非静态成员引用必须相对于特定对象。但它是 - 它与bgrPixel有关,不是吗?

1 个答案:

答案 0 :(得分:1)

更长的解释:

以下一行:

typedef Scalar_<uint8_t> bgrPixel;

声明一个别名 - brgPixel - 可用于代替Scalar_<uint8_t> - 它实际上只是节省了输入并使代码更清晰,更易于阅读。另外 - 在其他情况下 - 它允许您通过修改typedef而不是对变量类型iteself进行查找/替换来更改该类型。

它不做的是声明该类型的

因此,您可以删除typedef并声明变量:

Scalar_<uint8_t> bgrPixel;
bgrPixel.val[0] = pixelPtr[i*image.cols*cn + j*cn + 0]; 

或者,您可以使用typedef作为变量类型:

typedef Scalar_<uint8_t> bgrPixel;
bgrPixel pPixel;
pPixel.val[0] = pixelPtr[i*image.cols*cn + j*cn + 0];