C «Нет подходящего конструктора для инициализации «ошибка компилятора

#c #constructor

#c #constructor

Вопрос:

У меня есть класс, который я пытаюсь инициализировать, но получаю ошибку «Нет подходящего конструктора для инициализации ‘TextureCoordinates'»;

Класс, который я пытаюсь инициализировать:

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

Строка с ошибкой компилятора:

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

Определение конструктора:

 TextureCoordinates::TextureCoordinates(Point2Damp; origin, Dimensions2Damp; dim):
origin(origin), dim(dim) {}
  

Есть идеи, что я делаю не так?

Комментарии:

1. Где определение конструктора? Все, что я вижу, это объявление.

Ответ №1:

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

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

 TextureCoordinates(Point2D constamp; origin, Dimensions2D constamp; dim);
  

Ответ №2:

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

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

 TextureCoordinates(Point2Damp; origin, Dimensions2Damp; dim);
  

Вы можете исправить это, изменив подпись конструктора на

 TextureCoordinates(Point2Damp; origin, const Dimensions2Damp; dim);
TextureCoordinates(Point2Damp; origin, Dimensions2Damp;amp; dim); // alternative for c  11
  

(если вы можете)
или превращение параметра в переменную

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

Ответ №3:

Временные переменные не могут быть переданы в качестве ссылки в C , потому что тогда вы можете изменить значение временного объекта в функции, который скоро исчезнет!! Для ссылки на константы такой проблемы не существует….. Итак, ваше определение функции должно быть похоже

 TextureCoordinates(Point2D constamp; origin, Dimensions2D constamp; dim);
  

Ответ №4:

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

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

Ответ №5:

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

 TextureCoordinates(Point2Damp; origin, Dimensions2Damp; dim);