编译时错误,参数被识别为参考

时间:2011-12-06 03:08:21

标签: c++ function compiler-errors

在名为Castle的类中,我有以下两个函数:

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 个答案:

答案 0 :(得分:1)

问题是,您的Castle::getVerticalMoves方法需要vector<Location*>*作为第二个参数,而您调用它时,您传递的是vector<Location>*

即。您正在尝试将Location的向量发送到期望指向Location的指针向量的方法。

答案 1 :(得分:1)

你想要一个Location s的向量吗?或者你想要一个指向Location s指针的向量?你需要选择一个并坚持下去。

它显示引用的原因是因为如果它只显示了值,那表明你不能调用一个带引用的函数,因为引用可以出现在等号的左边,而值不能。您传递给函数的内容可以出现在等号的左侧,因此不要使用&amp;会使错误信息的信息量减少。 (建议你的错误可能是传递一个需要可修改引用的值。)

考虑:

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

所以当你传递一个左值(可以出现在等号左侧的东西)时,你真的在​​用一个引用来调用函数 - 比一个值更强大的东西。

答案 2 :(得分:0)

问题是你将std :: vector *传递给std :: vector *。与您的数据类型保持一致。如果您打算将指针传递给指针向量,则传递该指针。