Подтвердить что ты не робот

С++ "Нет соответствующего конструктора для инициализации" ошибки компилятора

У меня есть класс, который я пытаюсь инициализировать, но получаю ошибку "Нет конструктора соответствия для инициализации" 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) {}

Любые идеи, что я делаю неправильно?

4b9b3361

Ответ 1

Ваш конструктор принимает аргументы не-const-ссылкой, но вы передаете ему временный объект (Dimensions2D(width, height)). Временные, даже неконстантные, не привязываются к неконстантным ссылкам.

Решение, сделайте свой конструктор ссылкой на const (он не должен изменять переданные объекты):

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

Ответ 2

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

Второй параметр - это значение rvalue, которое не может быть привязано к ссылке lvalue, которую конструктор ожидает:

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)

Ответ 3

Объявить Dimensions2d снаружи.

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

Ответ 4

Временные переменные не могут быть переданы в качестве ссылки в С++, потому что тогда вы можете изменить значение временного объекта в функции, которая скоро исчезнет! Нет такой проблемы для ссылки на константы..... Таким образом, ваше определение функции должно быть похоже на

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

Ответ 5

Вы записали реализацию:

TextureCoordinates(Point2D& origin, Dimensions2D& dim);