я провел около двух часов на эту проблему, и я посетил эти StackOverflow вопросы перед:передачи значений в функцию, которая возвращает на структуру - константные ошибки
c++ passing a const object reference to a function
Passing const& as a function argument
оба не помогите мне, поэтому я указываю свою проблему здесь:
1) У меня есть класс Polygon
, который хранит Point2D
s в списке. Класс имеет среди других функций двух членов:
public:
std::pair<Point2D,Point2D> closestPts() const;
private:
Tripel const& findClosestPts (std::vector<Point2D> const& P,
std::vector<Point2D> const& X,
std::vector<Point2D> const& Y) const;
2) класс также содержит struct Triple
, которое возвращаемое значение функции findClosestPts
. Мне нужно это, потому что функция должна возвращать две точки и одно расстояние:
struct Tripel {
Point2D pt1;
Point2D pt2;
float dist;
};
Проблема в настоящее время в реализации Polygon.cpp. Это мой (текущий) код для двух указанных выше функций:
std::pair<Point2D,Point2D> Polygon::closestPts() const {
...
int size = m_points.size();
std::vector<Point2D> P (size);
std::vector<Point2D> X (size);
std::vector<Point2D> Y (size);
...
// some manipulation of the vectors, filling them with Point2D
// at this point, I have three non-const std::vector<Point2D>
// try to call the other function
Tripel closPts = findClosestPts(P, X, Y);
...
}
Tripel const& findClosestPts (std::vector<Point2D> const& P, std::vector<Point2D> const& X, std::vector<Point2D> const& Y) const {
...
}
Ошибка компилятора:
error: non-member function 'const Tripel& findClosestPts(...)' cannot have cv-qualifier
Так что я предполагаю, что я не позволил сделать эту функцию const
, потому что она возвращает struct
. Это правда?
В любом случае, я изменил функцию подписи к этому:
Tripel const& findClosestPts (std::vector<Point2D> const& P,
std::vector<Point2D> const& X,
std::vector<Point2D> const& Y);
Таким образом, функция не const
больше. Это приводит к следующей компиляционной ошибке:
error: passing 'const Polygon' as 'this' argument of 'const Tripel& Polygon::findClosestPts(...)' discards qualifiers [-fpermissive]
Я не знаю, что теперь делать. Я пробовал почти все, удаляя все утверждения const, меняя их, делая публичный findClosestPts
, делая его снова const, создавая три std :: вектора const, прежде чем передавать их в другую функцию ... но все привело к (разным) компиляция ошибок.
Так что мой вопрос в том, как мне нужно написать две функции, чтобы добиться следующего: я хочу иметь функцию closestPoints()
, которая является открытой функцией-членом и которая возвращает пару из двух ближайших точек. Для этого ему нужна вспомогательная, частная функция-член findClosestPts(vector1, vector2, vector3)
, которая возвращает вышеупомянутое struct Triple
?
Я был бы рад помочь, потому что я здесь stucked поскольку время:/
Вы действительно хотите вернуть ссылку на const? Это может легко привести к обманутой ссылке. «Triple», похоже, является типом значений в любом случае. – Andre
Confusion: Is 'Triple' ===' Tripel'? –
@ Robᵩ Я уверен, что они имеют в виду то же самое: английский и немецкий. ;-) – Andre