2012-07-12 91 views
2

我使用别人的函数,有:参考STL向量类型

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正确链接库。感谢大家的帮助,我希望我能把你们都标记为正确。

+0

看来你没有正确链接库或源文件定义此功能。 – netcoder 2012-07-12 01:13:08

+2

你的第一次尝试是正确的,所以你的问题是'optimise'的可用性,而不是你称之为的方式。你能发表你的声明和'optimise'的定义吗? – 2012-07-12 01:13:37

+0

这似乎是一个链接器错误,而不是编译器错误。你能告诉我们更多关于你如何构建你的应用程序吗?哪个平台,哪些工具? – MvG 2012-07-12 01:14:34

回答

2

你传递vector的第一种方式是正确的。编译器可以识别出该矢量是通过引用从头中的签名传递给该函数的,并对该矢量进行引用并将其传递给该函数。您看到链接器错误的事实告诉您编译阶段已成功完成。

链接器错误是存在的,因为你不能包括在optimise功能实现库。

+0

我认为,但我使用同一个库中的其他东西,它没有问题,所以我包含正确的头文件。 – 2012-07-12 01:17:00

+0

如果我说优化函数是一个类的一部分,我会初始化该类(可以调用对象优化器),它会工作正常吗?然后我使用class optimiser.optimise(input),它不能正常工作。 – 2012-07-12 01:18:36

+1

@Ben你肯定包括正确的头文件:否则,编译将失败。但是您没有链接正确的库(编译命令中缺少'-l' )。 – dasblinkenlight 2012-07-12 01:19:52

1

第一次尝试出现由于某些链接错误失败。您必须确保您调用的函数实际上可供链接程序使用,无论是在某种类型的库中,还是作为单独的翻译单元(源文件)或类似文件。只要包含头文件就足够了编译器,但不会帮助链接器。

'input' declared as reference but not initialised

这是有意义的:基准总是到别处存在一些对象的引用。因此,如果不先告诉它要引用什么,就不能使用引用。最常见的情况是使用引用作为函数参数。通常对象是调用者范围内的普通非引用对象,并通过引用传递给被调用者以避免复制。在这方面,你的第一次尝试是正确的。

+0

这是正确的,但是,我现在有一个问题,为什么它没有正确链接。请参阅编辑问题。 – 2012-07-12 01:20:57