c++ - 模板化 vs const 非模板化 vector 没有已知的转换

标签 c++ c++11 vector typedef

在我的实际代码中,我包含了一个库,但我一这样做,它就开始崩溃了。我设法将其中一些代码提取到这个最小的示例中,它演示了相同类型的错误:

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

让我特别困惑的是最后一个“参数 1 从‘const std::vector’到‘TDVectCats& {aka std::vector&}’的已知转换”,就好像它不能仅仅因为 typedef,就将某物的 vector 转换为相同的东西的 vector ?或者它可能与 const 有关 - 但我根本看不出我需要更改什么,以便像 loopSomeCats(getSomeCats()); 这样的调用成功...

最佳答案

您不能传递对 const 的引用对象为非常量引用。

loopSomeCats需要 std::vector<Cat>&作为参数,你想传递一个 const std::vector<Cat>&但这是不可能的。

const这意味着你不希望任何人修改返回值,但是如果你将它传递给一个只接受非常量引用的函数,那么理论上函数可以修改引用,并且你不想这样。

你应该删除 const如果你想修改返回值。

关于c++ - 模板化 vs const 非模板化 vector 没有已知的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37366557/

相关文章:

c++ - 将执行从一个线程转移到另一个线程以实现任务并行性和 future 调用

java - WEKA - 从 Java 中的特征向量列表创建实例

c++ - 如何使用 Doxygen 记录具有相同名称的枚举值?

c++11 什么是第一个?构造函数还是默认值?

c++ - g++ - 无法链接到使用 VS2012 构建的静态库

c++ - C++ 程序中的奇怪错误

c++ - 如何转换(指针 vector )-->(指向指针数组的指针)

vector - 有没有更友好的类似 RefCell 的对象?

c++ - 数组相关错误 - 无效类型..?

c++ - 可以安全地假设如果我对 async_read 进行两次调用,那么第二个调用将仅在第一个调用被处理后才被处理吗?