简体   繁体   English

没有已知的模板化与const非模板化向量转换

[英]no known conversion for templated vs const non-templated vector

In my actual code, I included a library, and as soon as I did that, it started crashing. 在我的实际代码中,我包含了一个库,一旦这样做,它便开始崩溃。 I managed to sort of extract some of that code into this minimal example, that demonstrates the same kind of error: 我设法将一些代码提取到这个最小的示例中,该示例演示了相同类型的错误:

// 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;
}

The result is: 结果是:

$ 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>&}’

What especially confuses me, is the last "no known conversion for argument 1 from 'const std::vector<Cat>' to 'TDVectCats& {aka std::vector<Cat>&}'", as if it cannot convert a vector of something, into the vector of the same something, just because of typedef ? 令我特别困惑的是最后一次“未知的将参数1从'const std :: vector <Cat>'转换为'TDVectCats&{aka std :: vector <Cat>&}''”,就好像它无法转换向量一样只是因为typedef导致某物进入同一物的向量? Or it maybe has to do with the const - but I simply cannot see what I need to change, in order to have a call like loopSomeCats(getSomeCats()); 或者它可能与const -但我根本看不到需要更改什么,才能进行loopSomeCats(getSomeCats());类的调用loopSomeCats(getSomeCats()); succeed... 成功...

You can't pass a reference to a const object to a non-const reference. 您不能const对象的引用传递给非const引用。

loopSomeCats takes a std::vector<Cat>& as argument, and you want to pass a const std::vector<Cat>& to it, but that's not possible. loopSomeCatsstd::vector<Cat>&作为参数,并且您想向其传递const std::vector<Cat>& ,但这是不可能的。

The const would mean that you don't want anyone to modify the return value, but if you pass it to a function which just takes a non-const reference, then theoretically the function can modify the reference, and you don't want that. const表示您不希望任何人修改返回值,但是如果将其传递给仅接受非const引用的函数,则理论上该函数可以修改该引用,而您不希望这样做。

You should drop the const if you want the return value to be modified. 如果要修改返回值,则应删除const

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM