0

MyNamespace.h:

namespace MyNamespace{
    int a
}

MyNamespace.cpp:を使用する関数

main.cpp

#include "MyNamespace.h"
main.obj : error LNK2005: "class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >
FileNamespace::m_rootDirectoryPath"
(?m_rootDirectoryPath@FileNamespace@@3V?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@A)
already defined in FileNamespace.obj
1>main.obj : error LNK2005: "struct FileNamespace::FileTree FileNamespace::m_dataFileTree"
(?m_dataFileTree@FileNamespace@@3UFileTree@1@A) already defined in
FileNamespace.obj
4

2 に答える 2

6

複数の変換ユニットでグローバル変数(外部リンケージを使用)を定義しているため、定義エラーが重複しています(ODRに違反しているため)。

代わりに、宣言を使用してヘッダーでextern宣言する必要があります

namespace MyNamespace{
    extern int a;
}

単一の.cppファイル(おそらくMyNamespace.cpp)で定義します

int MyNamespace::a;

このように、コンパイラは単一のオブジェクトモジュールにこの変数のインスタンスを1つだけ作成し、リンカは他のオブジェクトモジュールで作成された変数へのすべての参照をこの単一のインスタンスにリンクします。

これがヘッダーで関数を宣言し(プロトタイプのみを書き込む) 、単一ので関数を定義するのとまったく同じであることに気付くと、問題を理解するのに役立つ場合があります.cpp

于 2012-08-18T12:55:57.943 に答える
2

名前空間は他の変数と同じです。ヘッダーでは、単に宣言するのではなく、実際に「a」を定義しています。

ヘッダー内:

namespace MyNamespace{
    extern int a;
}

1つのソースファイル:

int MyNamespace::a;
于 2012-08-18T12:56:54.370 に答える