0

vector は 1 つのソース ファイルにのみ含まれています。ヘッダー ファイルに含まれる stl は文字列のみです。それでも、複数の定義エラーを取り除くことはできません (以下の例)。何か案は?

./plugin_dfb.o:mipsel-linux-uclibc/include/c++/4.2.0/bits/stl_bvector.h:182: `std::operator-(std::_Bit_iterator_base const&, std::_Bit_iterator_base const&) の複数定義' ./painter.o:mipsel-linux-uclibc/include/c++/4.2.0/bits/stl_bvector.h:182: 最初にここで定義

4

4 に答える 4

1

この std::operator- は、外部リンケージを持つインライン関数です。リンカーは、そのようなインライン関数の複数の定義をサポートしていないようです。しかし、C++ (ODR) の「1 つの定義規則」では、明らかにこれが可能です。通常、このようなシンボルは「弱いリンケージ」(GNU 用語) になりますが、オブジェクト ファイル形式とリンカの両方がこれをサポートする必要があると思います。

あなたのプラットフォーム専用のグループ/メーリング リストで質問してみます。「プラットフォーム X は、インライン関数とテンプレートのリンクと C++ 関連の 1 つの定義規則に関して C++ をサポートしていますか?」という行に沿ったもの。

GCC のドキュメントを確認することもできます。回避策としてコマンド ライン スイッチを提供している可能性があります。g++ をリンカのフロントエンドとしてまだ使用していない場合は、試してみてください。多分それも役立ちます。

于 2009-12-29T16:09:48.827 に答える
0

使ってみました#pragma onceか?

于 2009-12-29T11:09:35.520 に答える
0

ベクターを 1 つのヘッダー ファイルにのみインクルードしたと思いますが、そのヘッダー ファイルには #define ブロックがありません。これにより、含まれているベクター ヘッダー ファイルが再定義されます。インクルード ファイルを以下のテンプレートに含めて、試してみてください。

 #if !defined(HEADER_FILE) 
 #define HEADER_FILE
 // Your code
 #endif
于 2009-12-29T11:12:20.833 に答える
0

リンク中に問題が発生するため、テンプレートのインスタンス化に関連しているように見えます。インスタンス化の実装の詳細を考えると、テンプレートの関数/定義を共通のインクルード ファイルに配置して、それらがどこにでも表示され、ヘッダー インクルードが重複しないようにする必要があります。

あなたが投稿した問題は、演算子に関するものです。これは、 find() タイプの関数から呼び出される可能性のある std::distance() によって使用される可能性があります。そのため、そのような関数が定義または呼び出されているかどうかを調べて、それらがベクトルと文字列で機能する可能性があり、それらが共有ヘッダー ファイルにあることを確認してください。

于 2009-12-29T13:35:50.883 に答える