2012-01-19 10 views
1

私は、プロトタイプと同様に関数実装を持つヘッダファイルを持っています。私は今、これらの実装をファイルから分離しようとしており、ヘッダファイルに実装されている標準が良くないことを知っているので、プロトタイプをそのまま残しています。しかし、私はヘッダファイルから実装を削除し、独自のcppファイルに入れて、そのcppファイルをプロジェクトの残りの部分にリンクしようとすると、関数の複数の定義について不平を言う。任意のヘルプ/アドバイスC++多重定義

std::bitset<LENGTH> foo1(const std::string stringVal); 
std::bitset<LENGTH> foo2(const int decimalVal); 
std::string   foo3(const int integerVal); 

ためのおかげで、私はそれは同様に複数回含まれませんに含まガードを持っています。

その後、私は単にこれらの関数の実装を単純明快にしています。しかし、ヘッダファイルとは別に定義されていれば、関数の複数の定義が不平を言う。

編集:私の側で愚かなミスが解決されました。

+4

エラーメッセージとは何ですか?エラーメッセージを引き起こすコードは何ですか? –

+0

あなたはあなたの質問に答えるために十分な情報を提供していません。少なくとも、(1)ヘッダーファイルの内容、(2).cppファイルの内容、(3)リンカーコマンドラインを示す小さな例を提供してください。特に、 '#include'行がおそらく最も関連しています。 –

答えて

1

これは単なる宣言です。ファイルにガードが含まれていなくても、そのエラーは発生しません。

複数定義は、通常、複数の実装ファイルで関数を定義していることを意味します。ここで

は、チェックリストです:

  • 実装はヘッダの外definetelyであることを確認してください。

  • ついに

  • (この1つは簡単です、私はあなたがこれを行うにはありません知っている願っています)必ず一つだけのソースファイルは、関数を定義

  • は、ソースファイルが含まれていないことを確認しますクリーンビルドを実行することを確認してください。

0

以前はヘッダーファイルを含む他のcppファイルをコンパイルしていないようです。したがって、オブジェクトファイルにはまだ定義が含まれています。ヘッダーファイルに実装されていないBTWは、良い標準に関するものではありません。複数のコンパイルユニットに同じヘッダーを含めることができるようにする必要があります。

+2

実際には、メソッドがインラインであるかテンプレートを使用している場合(この場合は必須です)、ヘッダーファイルに実装することができます。 –

+0

あなたはそうです、申し訳ありません、私はそれがスタイルや良い基準の問題ではないことを強調しようとしていました。いずれにしても、それは必要です(テンプレート化された関数の場合でも、インラインの場合は警告メッセージを表示することができます) – enobayram