質問

私はまだC ++を学んでいます、と私は本当に前に自分の名前空間を作成したことがありません。私はそれらを試していたと私は仕事にほとんどのものを持っている間、私はまだやることができないよう一つのことがあります。私はNameOfClass::methodのようなものを入力しなくても、クラス内の静的メソッドを呼び出すことができるようにしたいと思います。ここで私はコードは次のようになります考えたものですが、それはコンパイルに失敗します:

タグ、A.hファイル
namespace Test
{
    class A
    {
        public:
            static int foo() { return 42; }
    };
}

タグ、main.cppファイル
#include <iostream>

#include "A.h"

using namespace std;
using namespace Test::A;

int main()
{
    cout << foo() << endl;

    return 0;
}

コンパイラが私を与えます:

main.cpp:6: error: ‘A’ is not a namespace-name
main.cpp:6: error: expected namespace-name before ‘;’ token
main.cpp: In function ‘int main()’:
main.cpp:10: error: ‘foo’ was not declared in this scope

A::fooを入力しなくても、私がやろうとしています何をすることは可能ですか?

役に立ちましたか?

解決

あなたは、静的メソッドのクラス名を指定する必要があり、その周りに方法はありません。

using namespace Test;

するとます:

int answerToEverything = A::foo();

他のヒント

C ++では、/特に/慎重コンパイラのエラーメッセージを読む必要があります。

最初のエラーだったに注意してください「エラー: 『A』は、名前空間名ではありません」。それは本当だ、Aはクラス名です。

using namespace Foo; // brings in  all of foo;
using Bar::Baz // brings in only Baz from Bar

あなたが書きたいます:

using Test::A;

2つの良いものをないこと:あなたが使用することはAにもたらし、そしてないように、あなただけ、あなたが必要なものを持ち込む必要があるので、それは、あまりにも良いですテスト、すべての残りの部分で持っていません偶然あなたが依存していることに気が付いていない何かに依存します。

fooがAで静的であるとして

しかし、あなたはまだ明示:: FOOを参照する必要があります。 (あなたが:: fooへの転送free関数を書くような何かを行う場合を除き、あなたが唯一のいくつかのタイピングを節約するためにそれをやっている場合、一般的には、これは悪い考えです。)

いくつかではなく、完全にすべての名前を修飾する、全く使用して宣言を使用していない助言することがあります。

しかし、これは「退屈でエラーが発生しやすい」(Stroustrup氏を引用する)であり、それはリファクタリングの邪魔になる:あなたは完全にクラスのfoomatic ::スタックのすべての使用を限定することを言い、その後、経営陣はただあなたの前に、主張barMaticは自分の会社を買収ので、あなたは、BarMaticの非常に類似したStackクラスを使用することを、生産に行くことを約再ます。

あなたは、grepををたくさんやって、あなたの正規表現は正しかった期待しているだろう、どこでもあなたは完全修飾持っていました。あなたが使用して宣言を使用した場合、あなたは自分の(うまくいけば共有)ヘッダファイルに修正を行うことができます。このように、使用して宣言はよく似ている「のtypedef int型ourInt;」またはマニフェスト定数またはCONST:「constのint型FOO = 1;」、それは多くの場所に呼ば何かを変更するために一つの場所を提供するという点で。完全にすべての使用時に名前空間を修飾すると、その利益を奪うます。

バズ、用BarMatic同等:

は逆に、あなたは管理がBarMatic :: Fooのを主張していますが、まだfoomaticのを使用していたと言うならば、あなたのgrepは、さらに困難であったかもしれないusingディレクティブを使用して名前空間のfoomaticのすべてに持っていました何らかの理由で使用できなくするためのものバズます。

だから、一度に一つの型(クラス、関数、定数)を持ち込むことは、最も柔軟性の一般最良の避けられないが、未知の変化から身を守るための方法です。ほとんどのコーディングと同じように、あなたは十分な精度を維持しながら、退屈な繰り返しを最小限にしたいです。

いいえ、それはあなたが任意のエレガントなファッションで何をしようとして行うことはできません。あなたが行うことができるでしょう最も近いものは、マクロまたはあなたの関数に委譲インライン関数を作成することです。しかし、これらの選択肢の両方がかなり醜いですので、私は任意のコードサンプルを投稿するつもりはありません。ただ、弾丸をかむと、全体の名前を指定するか、または静的メソッドは、単にグローバル関数になるようにコードをリファクタリングします。

は、「名前空間を使用して」乱用者にならないでください。これらの名前空間を使用してください!

std::cout << Test::A::foo() << std::endl;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top