Ошибка типа C ++ со ссылкой «Объект против объекта» - PullRequest
2 голосов
/ 17 мая 2010

У меня есть следующая функция (которая работала в Visual Studio):

bool Plane::contains(Vector& point){
    return normalVector.dotProduct(point - position) < -doubleResolution;
}

Когда я компилирую его, используя g ++ версии 4.1.2, я получаю следующую ошибку:

Plane.cpp: In member function âvirtual bool Plane::contains(Vector&)â:
Plane.cpp:36: error: no matching function for call to âVector::dotProduct(Vector)â
Vector.h:19: note: candidates are: double Vector::dotProduct(Vector&)

Итак, как вы можете видеть, компилятор считает (точка-позиция) вектором, но ожидает вектор &.

Какой лучший способ это исправить?

Я убедился, что это работает:

Vector temp = point-position;
return normalVector.dotProduct(temp) < -doubleResolution;

Но я надеялся на что-нибудь немного чище.

Я слышал предположение, что добавление конструктора копирования может помочь. Поэтому я добавил конструктор копирования в Vector (см. Ниже), но это не помогло.

vector.h:

Vector(const Vector& other);

Vector.cpp:

Vector::Vector(const Vector& other)
    :x(other.x), y(other.y), z(other.z), homogenous(other.homogenous) {
}

Ответы [ 4 ]

2 голосов
/ 17 мая 2010

A Vector временная переменная не может быть должным образом преобразована в Vector& - я думаю, что MSVC ++ здесь слишком слабый. Почему contains и dotProduct берут Vector& там, где им действительно не нужно изменять аргумент ?! Они должны взять const Vector&! Я думаю, что GCC направляет вас правильно здесь.

2 голосов
/ 17 мая 2010

Ваша проблема в том, что результат point - position является временным объектом, который нельзя привязать к неконстантной ссылке.

Если функция не изменяет аргумент, полученный по ссылке, то она должна принимать константную ссылку. Ergo, ваша функция скалярного произведения должна быть объявлена ​​как:

double Vector::dotProduct(const Vector&);
1 голос
/ 17 мая 2010

Проблема в том, что ваша функция dotProduct должна принимать свой параметр по константной ссылке.

1 голос
/ 17 мая 2010

point - position, кажется, создает временный объект типа Vector, и вы пытаетесь передать временную функцию, которая требует ссылки. Это не разрешено. Попробуйте объявить это как dotProduct(const Vector&);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...