6

今日興味深い問題に遭遇し、その理由を理解しようとしています。

次の点を考慮してください。

class Base
{
public:
    Base(){}
    ~Base(){}
    static void function1(){}
        void function2()
        {
           int function1;
           function1 = 0;
           function1();   //<-compiler error
           function1 = 1;
        }
};

次のエラーが表示されます。

明白な呼び出しの括弧の前にある式は、(ポインターへの) 関数型でなければなりません

このエラーが発生する理由を理解していると思います:

  1. function1が の外で単独で呼び出される場合function2()、実際には への関数ポインタfunction1()です。

  2. のスコープ内でfunction2int function1宣言されると、'function1変数' が 'function1関数ポインタ' を隠します。

  3. function1()内部で が呼び出されると、が変数であるとfunction2()想定され、エラーが発生します。function1

  4. Base::function1();これは、 insideを呼び出すことで修正されfunction2()ます。

私の質問はこれです:宣言時にコンパイラがエラーを出さないのはなぜint function1;ですか? これは許されるべきではないのですか?

4

2 に答える 2

12

ローカル変数は、ローカル ブロック内のメソッドの指定子を上書きします。this->function1()それでも呼んでみてください。

または、どちらか一方の名前を変更して、コードを読んでいる人が混乱を避けられるようにすることをお勧めします (これには、あなた自身の将来も含まれます)。

于 2016-01-19T21:19:35.700 に答える
3

「これを許可する必要がありますか」という質問に答えるには:

C ++では、異なるスコープに存在する場合(例のように)、同じ名前の異なるエンティティを持つことができます。これは一般的に非常に便利な機能です。名前空間などのスコープ内でエンティティを提供することを前提として、エンティティに好きな名前を使用できるためです。コンパイラは、コード内に名前が表示されたときにエンティティを選択するためのアルゴリズムが必要であると述べました。C++ では、名前を宣言に一致させる標準プロセスは「名前検索」と呼ばれます。このアルゴリズムの説明は、ここcppreferenceで、または標準ドラフトで直接見ることができます。

于 2016-01-19T21:36:36.277 に答える