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