C ++“没有用于初始化”编译器错误的匹配构造函数

时间:2011-11-12 00:25:05

标签: c++ constructor

我有一个类,我尝试初始化但得到错误“没有匹配构造函数初始化'TextureCoordinates'”;

我正在尝试初始化的类:

class TextureCoordinates
{
public:
    TextureCoordinates(){};
    TextureCoordinates(Point2D& origin, Dimensions2D& dim);
    Point2D getOrigin() const {return origin;};
    Dimensions2D getDim() const {return dim;};
private:
    Point2D origin;
    Dimensions2D dim;
};

与编译器错误对齐:

TextureCoordinates result(point, Dimensions2D(width, height));

构造函数的定义:

TextureCoordinates::TextureCoordinates(Point2D& origin, Dimensions2D& dim):
origin(origin), dim(dim) {}

任何想法我做错了什么?

5 个答案:

答案 0 :(得分:17)

您的构造函数通过非const引用获取参数,但您将临时对象(Dimensions2D(width, height))传递给它。 Temporaries,甚至是非const的,不会绑定到非const引用。

解决方案,让你的构造函数接受const引用(它不应该修改传递的对象):

TextureCoordinates(Point2D const& origin, Dimensions2D const& dim);

答案 1 :(得分:4)

TextureCoordinates result(point, Dimensions2D(width, height))

第二个参数是一个rvalue,它不能绑定到构造函数所期望的左值引用:

TextureCoordinates(Point2D& origin, Dimensions2D& dim);

您可以通过将构造函数的签名更改为

来修复它
TextureCoordinates(Point2D& origin, const Dimensions2D& dim);
TextureCoordinates(Point2D& origin, Dimensions2D&& dim); // alternative for c++11

(如果可以的话) 或使参数成为变量

Dimension2D dim=Dimensions2D(width, height);
TextureCoordinates result(point, dim)

答案 2 :(得分:0)

在外面声明Dimensions2d。

Dimension2d d(width, height);
TextureCoordinates result(point, d);

答案 3 :(得分:0)

临时变量不能作为C ++中的引用传递,因为这样你就可以在函数中更改临时对象的值,这个值很快就会消失!!参考常数不存在这样的问题..... 所以你的函数定义应该是

TextureCoordinates(Point2D const& origin, Dimensions2D const& dim);

答案 4 :(得分:-1)

你写了以下的实现:

TextureCoordinates(Point2D& origin, Dimensions2D& dim);