2

私はこのような設定をしています

ファイル.h:

#pragma once
namespace a {
    int home(double a, double b, ...
    class b {
        int la();
    };
}

ファイル.cpp

#include "file.h"    
using namespace a;

int home(double a, double b, ...) {
    //function stuff
}

int b::la() {
    home(1, 2, ...)
}

bはインスタンス化され、次のように main で使用されます。

#include "file.h"    
b instant;
instant.la()

しかし、関数を使用しているすべての場所でこのリンカー エラーが発生していますhome

undefined reference to `a::home(double, double, ...)'
In function a::b::la()

すべての CMakelist が正しく設定され、すべてが含まれていると確信しています。

しかし、file.cppを名前空間に変更すると、次のようになります。

namespace a {
    all of the same stuff
}

それはうまく動作しますか?

なぜこれが起こっているのですか?

4

4 に答える 4

8

あなたの問題はusing namespace a;、file.cpp の一番上にあります。これは、すべての定義をnamespace aコードに取り込むだけです。したがって、 を定義するint home(double, double, ...)と、 の実装を提供するのではなく、a::home別の関数を作成することになります。とがint a::home(double, double, ...)ありint home(double, double, ...)ます。

の下にあるファイル内のint a::home(double, double, ...)すべてをラップする必要があるか、ラップする必要があります。.cppnamespace anamespace a { ... }

編集:あなたの混乱は、using宣言が行うことから生じます。名前空間からすべてを取得するだけで、a修飾なしで使用できます。定義で修飾を省略することはできません。

于 2013-01-02T06:29:37.933 に答える
3

宣言されている場所があるため、名前空間内で関数を定義する必要があります。a

namespace a
{
    int home(double a, double b, ...) {
      //function stuff
    }
}
于 2013-01-02T06:26:15.347 に答える
3

file.cpp 内namespace aで定義をラップすると、名前空間aでそれらが定義され、リンカーはシンボルを見つけることができます。

namespace a{

int home(double a, double b, ...) {
    //function stuff
}

int b::la() {
    home(1, 2, ...)
}

} // namespace a

ノードはusing namespace a、関数を定義していませんinside namespace a

google c++ コーディング スタイル ガイドをご覧ください。優れた c++ コーディング スタイルが提供されています。

于 2013-01-02T06:30:50.247 に答える
2

の定義は、それが宣言された名前空間であるため、home言う必要があります。a::homeしたがって、「a::home」への参照は未定義です。

于 2013-01-02T06:26:35.683 に答える