2

私は次のような他の誰かの関数を使用しています:

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でライブラリを正しくリンクしていませんでした。みんなの助けに感謝します、私はあなた全員を正しいとマークできたらいいのにと思います。

4

2 に答える 2

2

を渡す最初の方法vectorは正しいです。コンパイラーは、ヘッダー内のシグニチャーからの参照によってベクトルが関数に渡されることを認識し、ベクトルへの参照を作成して、それを関数に渡します。リンカエラーが表示されるという事実は、コンパイル段階が正常に完了したことを示しています。

optimise関数が実装されているライブラリを含めることができないため、リンカエラーが発生します。

于 2012-07-12T01:15:07.383 に答える
1

最初の試行は、リンカーエラーが原因で失敗したようです。呼び出す関数が、ある種のライブラリで、または別の変換ユニット(ソースファイル)として、または同様のものとして、リンカで実際に使用可能であることを確認する必要があります。コンパイラーにとってはヘッダーを含めるだけで十分ですが、リンカーには役立ちません。

「入力」は参照として宣言されていますが、初期化されていません

これは理にかなっています。参照は常に、他の場所に存在するオブジェクトへの参照です。したがって、最初に何を参照するかを指示せずに参照を使用することはできません。最も一般的なケースは、関数の引数として参照を使用することです。通常、オブジェクトは呼び出し元のスコープ内の通常の非参照オブジェクトであり、コピーを回避するために参照を介して呼び出し先に渡されます。その点で、あなたの最初の試みは正しいです。

于 2012-07-12T01:19:27.440 に答える