C ++ / VS2005:二つの異なるの.cppファイルに同じクラス名を定義します
-
20-09-2019 - |
質問
が、私はこれに走っています。
私のユニットテストフレームワーク(unittestの++)は、備品として機能する構造体を作成することができます。通常、これらは私が私のユニットテストファイルの先頭にそれらを置くので、ファイル内のテストに合わせてカスタマイズされます。
//Tests1.cpp
struct MyFixture { MyFixture() { ... do some setup things ...} };
TEST_FIXTURE(MyFixture, SomeTest)
{
...
}
//Tests2.cpp
struct MyFixture { MyFixture() { ... do some other setup things, different from Tests1}};
TEST_FIXTURE(MyFixture, SomeOtherTest)
{
...
}
しかし、私はあなたが同じ名前を使用してフィクスチャの構造体に名前を付けるとき、(今と同じ名前を持つ構造体が存在の2つのバージョン)、その後のはバージョンのいずれかが静かであること(少なくともVS2005で)最近発見しましたを放り出さ。私は/ W4(最高警告レベル)に私のコンパイラのセットを持っているので、これは、かなり驚くべきことであると警告が出てきません。私は、これは名前の衝突だと思い、そしてなぜ名前空間が考案されましたが、私は実際に別の名前空間で私のユニットテストフィクスチャのそれぞれをラップする必要がありますか?私はちょうど私がもっと根本的な何かが欠けていないよ確認します。
これが起こってしなければならない -この問題を解決する良い方法はありますか?私は、重複シンボル・エラーか何かを見てすべきではない?
解決
無名名前空間のクラスを貼り付ける試してみてください、あなたは各ファイルの新しい名前空間を作成し、名前を付けることよりも、それはあまり不快かもしれません。
DOはVS2005とCPPユニットへのアクセスを持っていないが、これは動作する可能性..
//Tests1.cpp
namespace
{
struct MyFixture { MyFixture() { ... do some setup things ...} };
}
TEST_FIXTURE(MyFixture, SomeTest)
{
...
}
//Tests2.cpp
namespace
{
struct MyFixture { MyFixture() { ... do some other setup things, different from Tests1}};
}
TEST_FIXTURE(MyFixture, SomeOtherTest)
{
...
}
他のヒント
コンパイラは、一度に1つのコンパイル単位で動作します。これは、それがの#includeソースファイルとは何だろう。あなたのクラスは別のファイルにあるので、そこには葛藤ます。
それはどちらかの紛争を見ていないので、一緒にリンカプットのすべてが、それは、クラスの定義について知りません。
Cの時代に戻るリンカは、同じ名前を持つ2つの異なる機能を持っていたことを認識し、エラーメッセージを生成するために、それは非常に一般的でした。 C ++のインライン関数やテンプレートを使用すると、それはもうそれを行うことはできません - リンカはちょうど彼らが同じだと仮定して別のコンパイル単位は、多くの場合、同じ機能の重複が含まれています。
。これは基本的にクラスが各オブジェクト・ファイル内のクラスの冗長定義を有することにヘッダファイル、リードに定義する必要があるという事実の結果です。だから、C ++リンケージを扱うことができるリンカは一緒に冗長クラス宣言を折ると、クラスが一度だけ宣言されたことをふりをしています。
リンカは、複数のオブジェクトや複数のオブジェクトに同じ名前の複数のクラスに含まれる単一のクラスを区別するための任意の方法はありません。
あなたはこれを回避するには、名前空間(またはより良い言語)を使用する必要があります。