未在此范围内声明

was not declared in this scope

本文关键字:声明 范围内      更新时间:2023-10-16

我是c++的新手,正在做一个QT项目,我创建了一个名为imageconvert.h的头文件,如下所示:

class ImageConvert
{
private:
IplImage *imgHeader;
uchar* newdata;
public:
ImageConvert();
~ImageConvert();
IplImage* QImage2IplImage(QImage *qimg);
QImage* IplImage2QImage(IplImage *iplImg);
};

我还在imageconvert.cpp文件中定义了这些公共方法。

现在,我想从其他cpp文件调用QImage2IplImage和IplImage2QImage。我在CPP文件中包含imageconvert。h并调用这两个函数。

给出以下错误:

error: 'QImage2IplImage' was not declared in this scope
error: 'IplImage2QImage' was not declared in this scope

您定义的函数是ImageConvert类的成员函数。您需要该类的一个实例才能调用它们。

类似:

ImageConvert ic;
ic.QImage2IplImage(your_QImage_object);

如果你不需要状态来做转换,你应该让那些辅助函数static。然后你可以用:

ImageConvert::QImage2IplImage(your_QImage_object);

而不首先创建ImageConvert的实例。但是请注意,您将无法在这些静态函数中使用imgHeadernewData -它们是成员变量,仅在该类的实例中可用。

您还可以从类中删除这些函数并将它们放在namespace中。

你的问题…

如何调用这些函数?给定你的ImageConverter类,你应该这样做:

// First create a new converter
ImageConverter conv;
IplImage* ipl = conv.QImage2IplImage(qimg);
qimg = conv.IplImage2QImage(ipl);

…关于使用类

的一些建议

你有Java或c#的背景吗?如果是这样,你应该知道在c++中你也可以有自由函数(不属于任何类)。只有在需要抽象某个(现实世界)概念时才应该使用类,而不是简单地将类作为对函数进行分组的方法:

// image_converter.h
IplImage* QImage2IplImage(const QImage* qimg);
QImage* IplImage2QImage(const IplImage* iplImg);
// someother.cpp
IplImage* ipl = QImage2IplImage(qimg);
qimg = IplImage2QImage(ipl);

注意我将const添加到函数参数—const正确是件好事。此外,您可以将函数分组到一个名称空间中:

// image_converter.h
namespace converter
{
    IplImage* QImage2IplImage(const QImage* qimg);
    QImage* IplImage2QImage(const IplImage* iplImg);
}
// someother.cpp
IplImage* ipl = converter::QImage2IplImage(qimg);
qimg = converter::IplImage2QImage(ipl);