C ++ «Нет подходящего конструктора для инициализации» ошибки компилятора - PullRequest
17 голосов
/ 12 ноября 2011

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

17 голосов
/ 12 ноября 2011

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

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

TextureCoordinates(Point2D const& origin, Dimensions2D const& dim);
4 голосов
/ 12 ноября 2011
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)
0 голосов
/ 12 ноября 2011

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

TextureCoordinates(Point2D const& origin, Dimensions2D const& dim);
0 голосов
/ 12 ноября 2011

Объявить размеры2d снаружи.

Dimension2d d(width, height);
TextureCoordinates result(point, d);
0 голосов
/ 12 ноября 2011

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

TextureCoordinates(Point2D& origin, Dimensions2D& dim);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...