在我的实际代码中,我包含了一个库,一旦我这样做,它就开始崩溃了。我设法将一些代码提取到这个最小的例子中,它演示了同样的错误:
// g++ -std=c++11 -g -o test-classcall.exe test-classcall.cpp
#include <iostream>
#include <vector>
#include <stdio.h>
class Cat
{
public:
int Age;
Cat() : Age(0) {}
};
std::vector<Cat> myPCats;
typedef std::vector<Cat> TDVectCats;
TDVectCats myTDCats;
void loopSomeCats() {
printf("this function just to cause searching for matching calls\n");
}
void loopSomeCats(TDVectCats& incats) {
std::vector<Cat>::iterator iter;
for(iter = incats.begin(); iter != incats.end(); iter++) {
printf("hm\n");
}
}
const std::vector<Cat> & getSomeCats() {
return myPCats;
}
void doSomething() {
loopSomeCats(getSomeCats());
}
int main() {
myTDCats.push_back(Cat());
myTDCats.push_back(Cat());
myPCats.push_back(Cat());
doSomething();
std::cout << "Hello World! " << std::endl;
return 0;
}
结果是:
$ g++ -std=c++11 -g -o test-classcall.exe test-classcall.cpp
test-classcall.cpp: In function ‘void doSomething()’:
test-classcall.cpp:36:29: error: no matching function for call to ‘loopSomeCats(const std::vector<Cat>&)’
loopSomeCats(getSomeCats());
^
test-classcall.cpp:36:29: note: candidates are:
test-classcall.cpp:20:6: note: void loopSomeCats()
void loopSomeCats() {
^
test-classcall.cpp:20:6: note: candidate expects 0 arguments, 1 provided
test-classcall.cpp:24:6: note: void loopSomeCats(TDVectCats&)
void loopSomeCats(TDVectCats& incats) {
^
test-classcall.cpp:24:6: note: no known conversion for argument 1 from ‘const std::vector<Cat>’ to ‘TDVectCats& {aka std::vector<Cat>&}’
让我感到特别困惑的是,“const std :: vector&lt; Cat&gt;”到'TDVectCats&amp; {aka std :: vector&lt; Cat&gt;&amp;}''的最后一个“没有已知的参数1转换”,好像它只是因为typedef
而无法将某物的矢量转换为同一物体的矢量?或者它可能与const
有关 - 但我根本无法看到我需要改变的内容,以便像loopSomeCats(getSomeCats());
这样的呼叫成功...
答案 0 :(得分:1)
您无法将对const
对象的引用传递给非const引用。
loopSomeCats
以std::vector<Cat>&
作为参数,您希望将const std::vector<Cat>&
传递给它,但这是不可能的。
const
意味着你不希望任何人修改返回值,但是如果你把它传递给一个只带非const引用的函数,那么理论上函数可以< / em>修改引用,你不希望这样。
如果希望修改返回值,则应删除const
。