1

lnk2005 エラーが発生したとき、名前空間をいじっていました。エラーを回避する方法がわかりません。エラーは次のとおりです。

1>Source.obj : error LNK2005: "int Chart::Bars::d" (?d@Bars@Chart@@3HA) already defined in Chart.obj
1>Source.obj : error LNK2005: "class foo Chart::l" (?l@Chart@@3Vfoo@@A) already defined in Chart.obj
1>Source.obj : error LNK2005: "int Chart::t" (?t@Chart@@3HA) already defined in Chart.obj
1>C:\Users\bnm\dev\examples\play\nmspca\Debug\nmspca.exe : fatal error LNK1169: one or more multiply defined symbols found
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.49
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

これがコードです...

Chart.h

#pragma once

#include "foo.h"

namespace Chart
{
    int t;

    foo l;

    namespace Bars
    {

        int d;
    }

}

フー。

#pragma once

class foo
{
public:
    int ss;
    char* h;

};

Chart.cpp

#include "Chart.h"

using namespace Chart;

int main ()
{
    l.h = "g";
}

ソース.cpp

#include "Chart.h"

using namespace Chart;

int test()
{
    l.ss = 0;

    return l.ss;
}

#include "Chart.h" を Source.cpp から削除すると、問題はなくなります。ただし、Source.cpp には名前空間の定義に #include "Chart.h" が必要です。

すべてがコンパイルされるように、Chart.cpp と Source.cpp の両方で「namespace Chart」が必要であることを表現する正しい方法は何ですか?

4

3 に答える 3

5

ヘッダー ファイルでオブジェクトを定義し、そのヘッダー ファイルを複数の翻訳単位に含める場合、それらのオブジェクトは複数回定義されるようになりました。これがあなたが抱えている問題です。tl、およびの宣言はdオブジェクトを導入し、ヘッダー ファイルでそれを行いました。

名前空間スコープ変数をサポートする適切な方法は、それらをexternヘッダー ファイルで宣言することです。これにより、それらは定義ではなく宣言のみになります。次に、単一の実装ファイルでそれらを定義します。

変更Chart.h:

#pragma once

#include "foo.h"

namespace Chart
{
    extern int t;

    extern foo l;

    namespace Bars
    {

        extern int d;
    }

}

次に、実装ファイルで、おそらくChart.cpp次のようにします。

int Chart::t;
foo Chart::t;
int Chart::Bars::d;
于 2013-02-26T13:59:19.567 に答える
2

Chart.h をインクルードしているすべての場所で、変数 t、l、および d をこれらのオブジェクトに事実上ドロップしています。それらを extern として宣言し、Chart.cpp で定義します。

于 2013-02-26T13:59:47.417 に答える
0

私はまったく同じ問題を抱えていて、回避策を見つけました。

chart.h は次のようになります。

#pragma once

#include "foo.h"

class Chart{
    static int t;
    static foo l;
    class Bars
    {
        static int d;
    };
};

chart.cpp で変数を定義します。

int Chart::t;
foo Chart::l;
int Chart::Bars::d;

醜いことはわかっていますが、少なくとも、vars を使用する必要がある場合はどこでも構文は同じです。

このようにして、複数の定義エラーを防ぐ変数を含む .obj ファイルが 1 つだけ作成されます。
問題を解決できる名前空間で静的変数を宣言できるかどうかは試していません。

編集:

PSこのソリューションは、msvcで奇妙なエラーを発生させます。コードが含まれるたびに、コードのセクションが異なる変数を参照するようになります

自分のプログラムで static-inside-namespace をテストしたところ、うまくいくようです。
例.h:

namespace sdl{
    static SDL_Surface* screen;

    static int xres = 640;
    static int yres = 480;
    static int bpp  = 32;
    static int flags = SDL_ASYNCBLIT;

};
于 2013-06-04T15:42:28.733 に答える