MKS
MKS

Reputation: 786

was not declared in this scope

I am new in C++ and working on a project with QT. I created a header file called imageconvert.h which is as follow:

class ImageConvert
{

private:
IplImage *imgHeader;
uchar* newdata;

public:

ImageConvert();
~ImageConvert();
IplImage* QImage2IplImage(QImage *qimg);
QImage* IplImage2QImage(IplImage *iplImg);
};

also I defined those public methods in imageconvert.cpp file.

Now, I want to call QImage2IplImage and IplImage2QImage from other cpp file. So i include imageconvert.h in that CPP file and called those two functions.

it gives the the following errors:

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

Any help would be greatly appreciated.

Upvotes: 0

Views: 8762

Answers (2)

Mat
Mat

Reputation: 206659

The functions you've defined are member functions of the ImageConvert class. You need an instance of that class to be able to call them.

Something like:

ImageConvert ic;
ic.QImage2IplImage(your_QImage_object);

If you don't need state to do the conversion, you should make those helper functions static. Then you can call them with:

ImageConvert::QImage2IplImage(your_QImage_object);

without first creating an instance of ImageConvert. But please note that you will not be able to use imgHeader or newData in those static functions - they are member variables, only usable within an instance of that class.

You could also remove these functions from your class and put them in a namespace.

Upvotes: 5

Paul Manta
Paul Manta

Reputation: 31567

Your question...

How exactly do you call those functions? Given your ImageConverter class, this is how you should be doing it:

// First create a new converter
ImageConverter conv;

IplImage* ipl = conv.QImage2IplImage(qimg);
qimg = conv.IplImage2QImage(ipl);

... And some advice on using classes

Do you by any chance come from a Java or C# background? If so, you should know that in C++ you can also have free functions (that don't belong to any class). You should only use classes when you need to abstract a certain (real world) concept, and not simply as a way to group functions:

// image_converter.h
IplImage* QImage2IplImage(const QImage* qimg);
QImage* IplImage2QImage(const IplImage* iplImg);

// someother.cpp
IplImage* ipl = QImage2IplImage(qimg);
qimg = IplImage2QImage(ipl);

Notice I added const to the function parameters — it's a good thing to be const correct. Additionaly, you can group your functions in a namespace:

// 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);

Upvotes: 3

Related Questions