【问题标题】:Reference to STL Vector Type引用 STL 向量类型
【发布时间】:2012-07-12 01:05:34
【问题描述】:

我正在使用其他人的功能:

optimise(std::vector<double> &input)

它编辑输入。

我应该如何将向量传递给这个,我试过了:

std::vector<double> input;
input.push_back('several points');
optimise(input);

这有一个链接器错误说:

undefined reference to optimise(std::vector<double, std::allocator<double> >&)

如果我试试这个:

 std::vector<double> &input;
input.push_back('several points');
optimise(input);

然后出现编译错误:

'input' declared as reference but not initialised

如何初始化对向量的引用,或者我做错了什么。 编辑:

我没有在我的 CMakeLists 中正确链接库。谢谢大家的帮助,我希望我能把你们都标记为正确的。

【问题讨论】:

  • 看来您没有正确链接定义此函数的库或源文件。
  • 您的第一次尝试是正确的,所以您的问题在于optimise 的可用性,而不是您调用它的方式。你能发布你对optimise的声明和定义吗?
  • 这似乎是链接器错误,而不是编译器错误。您能告诉我们更多关于您如何构建应用程序的信息吗?哪个平台,哪些工具?

标签: c++ stl reference vector


【解决方案1】:

您传递vector 的第一种方式是正确的。编译器通过标头中的签名的引用识别出向量是通过引用传递给函数的,引用您的向量,并将其传递给函数。您看到链接器错误的事实表明编译阶段已成功完成。

出现链接器错误是因为您未能包含实现 optimise 函数的库。

【讨论】:

  • 我是这么想的,但是我使用了同一个库中的其他东西,它没有问题,所以我包含了正确的头文件。
  • 如果我说优化函数是一个类的一部分会有帮助吗?我初始化那个工作正常的类(让我们调用对象优化器)。然后我使用了不能正常工作的类 optimiser.optimise(input)。
  • @Ben 你肯定包含了正确的头文件:否则,编译会失败。但是您没有链接到正确的库(您的编译命令中的 -l 丢失)。
  • @Ben “然后我使用了不能正常工作的类 optimiser.optimise(input)。”最可能的原因是优化器类的构造函数在标头中,但optimizer::optimize 的实现在库中。查看库手册以获取您需要链接的库的名称(在 unix/linux/mac 上通常为 lib&lt;some-name&gt;.so 或 .lib。)
【解决方案2】:

由于某些链接器错误,第一次尝试似乎失败了。您必须确保您调用的函数实际上对链接器可用,无论是在某种库中,还是作为单独的翻译单元(源文件)或类似的。仅包含标头对编译器来说就足够了,但对链接器没有帮助。

'input' 声明为引用但未初始化

这是有道理的:引用始终是对存在于别处的某个对象的引用。因此,如果不先告诉它要引用什么,就不能使用引用。最常见的情况是使用引用作为函数参数。通常该对象将是调用者范围内的普通非引用对象,并通过引用传递给被调用者以避免复制。在这方面,您的第一次尝试是正确的。

【讨论】:

  • 这是正确的,但我现在有一个问题,为什么它没有正确链接。请参阅已编辑的问题。
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 2020-07-21
  • 1970-01-01
  • 2010-10-08
  • 2011-08-07
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多