Ошибка времени компиляции, параметры распознаются как ссылки - PullRequest
0 голосов
/ 06 декабря 2011

Внутри класса Castle у меня есть следующие 2 функции:

vector<Location> Castle::getMoves(Location*** squares, Location* loc){
    int row = loc->getRow();
    int col = loc->getCol();

    vector<Location> moves;

    //problem is here!
    getVerticalMoves(squares, &moves, row, col);

    return moves;
}

void Castle::getVerticalMoves(Location*** squares, vector<Location*> * moves, int row, int col){
    //need to do something here, but can't call the function!
}

Когда я пытаюсь скомпилировать, я получаю сообщение об ошибке, похожее на это:

model/src/Castle.cpp: In member function ‘std::vector<Location> Castle::getMoves(Location***, Location*)’:
model/src/Castle.cpp:26:44: error: no matching function for call to ‘Castle::getVerticalMoves(Location***&, std::vector<Location>*, int&, int&)’
model/inc/Castle.h:38:8: note: candidate is: void Castle::getVerticalMoves(Location***, std::vector<Location*>*, int, int)
make: *** [model/obj/Castle.o] Error 1

Я не понимаю, почему эта ошибка появляется. Почему это говорит, что я передаю это ссылки?

Ответы [ 3 ]

1 голос
/ 06 декабря 2011

Вы хотите вектор Location с? Или вы хотите вектор указателей на Location с? Вам нужно выбрать один и придерживаться его.

Причина, по которой он показывает ссылку, состоит в том, что если бы он показывал только значение, это означало бы, что вы не могли бы вызвать функцию, которая берет ссылку, поскольку ссылка может появиться слева от знака равенства, а значение не может , То, что вы передали в функцию , может появиться слева от знака равенства, поэтому, если вы укажете символ &, сообщение об ошибке станет менее информативным. (Предположим, возможно, вашей ошибкой было передать значение, где требовалась изменяемая ссылка.)

Рассмотрим:

int f1(int &j) { j++; return 3; }
int f2(int j) { return j+1; }
int q;

f1(3); // not legal, we are passing an 'int' value and need an 'int' reference
f2(3); // legal, passing an 'int' value function needs an 'int' value
f1(q); // legal, we are passing an 'int&', function need an 'int&'
f2(q); // legal, reference can be demoted to value

Поэтому, когда вы передаете lvalue (то, что может появиться слева от знака равенства), вы действительно вызываете функцию со ссылкой - что-то более мощное, чем простое значение.

1 голос
/ 06 декабря 2011

Проблема в том, что ваш Castle::getVerticalMoves метод принимает vector<Location*>* в качестве второго аргумента, тогда как когда вы его вызываете, вы передаете vector<Location>*

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

0 голосов
/ 06 декабря 2011

Проблема в том, что вы передаете std :: vector * в std :: vector *. Будьте согласны с вашими типами данных. Если вы намереваетесь передать указатель на вектор указателей, передайте это.

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