2012-07-12 140 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