11

どこかに名前空間を定義してグローバル スコープでアクセスできるようにすると、標準のヘッダーlogと衝突します。実際、ほとんどのコンパイラ (SunCC、MSVC、GCC のほとんどのバージョン) はこれに対応しているようですが、GCC 4.1.2 はそうではありません。double log(double)cmath

残念ながら、using名前空間識別子の宣言は合法ではないため、あいまいさを解決する方法はないようです。log::Logが含まれていても、グローバル名前空間に書き込む方法を知ってcmathいますか?

ありがとう。

編集:これについてC++03標準が何を言っているか知っている人はいますか? logスコープ演算子は、以下のコード例での使用を十分に明確にしていると思います。

#include <cmath>

namespace foo
{

namespace log
{

struct Log { };

} // namespace log

} // namespace foo


using namespace foo;

int main()
{
    log::Log x;

    return 0;
}

// g++ (GCC) 4.1.2 20070115 (SUSE Linux)

// log.cpp: In function `int main()':
// log.cpp:20: error: reference to `log' is ambiguous
// /usr/include/bits/mathcalls.h:110: error: candidates are: double log(double)
//     log.cpp:7: error:                 namespace foo::log { }
// log.cpp:20: error: expected `;' before `x'
4

4 に答える 4

12

私はお勧めします:

foo::log::Log x; // Your logging class
::log(0.0); // Log function

using namespace foo;一般に、使用しない場合は名前空間に配置しても意味がなくfoo、グローバル名前空間を汚染するため、私は書きません。

この関連する質問を参照してください:
C++ でネームスペースを適切に使用するにはどうすればよいですか?

于 2010-10-06T10:28:06.410 に答える
8

役に立ちませんが、GCC 4.1.2 からのエラーは正しくありません。loginはlog::Log、クラスまたは名前空間の名前のみを参照できます。

コードを GCC 4.1.2 でコンパイルする必要がある場合は、次の 2 つのオプションがあります。

  1. 完全修飾名を使用するfoo::log::Log
  2. 名前空間エイリアスを使用します。

    namespace log1 = foo::log;
    log1::Log logger;
于 2010-10-06T10:37:18.043 に答える
1

cmath何らかの理由で使用::logしてグローバルスコープから取得し、関数と名前空間の間で決定できません。

名前空間は、関数シグネチャの混乱汚染を防ぐためにコードを保持します。

これは、適切な 名前空間使用法に関する完全で文書化されたデモです。

#include <iostream>
#include <cmath>  // Uses ::log, which would be the log() here if it were not in a namespace, see https://stackoverflow.com/questions/11892976/why-is-my-log-in-the-std-namespace

// Silently overrides std::log
//double log(double d) { return 420; }

namespace uniquename {
    using namespace std;  // So we don't have to waste space on std:: when not needed.

    double log(double d) {
        return 42;
    }

    int main() {
        cout << "Our log: " << log(4.2) << endl;
        cout << "Standard log: " << std::log(4.2);
        return 0;
    }
}

// Global wrapper for our contained code.
int main() {
    return uniquename::main();
}

出力:

Our log: 42
Standard log: 1.43508
于 2015-05-06T03:17:04.637 に答える