No matching call to default constructor, when usin

2020-02-06 10:34发布

问题:

I have a class B that creates an object of a class A and calls a method of the object.

a.h

#ifndef A_H
#define A_H

class A
{
public:
    A(int);
    void function();
};

#endif // A_H

a.cpp

#include "a.h"

A::A(int x)
{

}
void A::function(){
    //Do something.
}

b.h

#ifndef B_H
#define B_H
#include <QVector>
#include <a.h>


class B
{
public:
    B(int);
    QVector<A> list;
};

#endif // B_H

b.cpp

#include "b.h"

B::B(int y)
{
    list.append(A(y));
    list[0].function();
}  

The problem is that this does not compile. It returns "no matching function to call 'A:A()'". I know that this can be solved with a forward declaration but this does not work here since I want to call the function "function". I also do not want to include the whole class A in the class B.

回答1:

As with many Qt containers, QVector's element type must be an assignable data type in your version.

Unlike the standard library, Qt defines this as:

The values stored in the various containers can be of any assignable data type. To qualify, a type must provide a default constructor, a copy constructor, and an assignment operator.

This is really unfortunate, because there's no practical need for a default constructor in your example, and indeed a std::vector would (compliantly) let you use an element type that doesn't have one.

The QVector::value(int) function does rely on this property, but you're not using it! The Qt devs must be doing some kind of checks up-front, rather than taking the standard library's approach of "just check preconditions when they're actually needed", or else this is an "accident" of the code!

As a consequence, until 5.13 in which this was changed, you will have to give A a default constructor, sorry.

Don't forget a copy constructor, too… and a proper qualification on that A::function() definition.

A forward declaration will not solve this, neither do you need one. In fact, adding one to this particular program will do literally nothing. ;)



回答2:

First in a.cpp update function definition:

void A::function(){  // A: added
    //Do something.
}

Second, I would add A(const A&) copy constructor since list may need this for internal buffer reallocation purposes.



标签: c++ qt qvector