2016-05-27 4 views
0

私はこの問題を説明するが、この例を取る言い回しを少しわからないよ:コンパイラで、クラスで修飾されたメンバ関数定義の戻り値の型にclass修飾子が必要なのはなぜですか?

がfoo.h

namespace sample { 

    class Foo { 
    public: 
     enum Bar { 
     kValue1, 
     kValue2, 
     } 

     Bar SomeMethod(Bar some_value); 
    } 
} // namespace sample 

Foo.cc

namespace sample { 

    Bar Foo::SomeMethod(Bar some_value) { // compiler complains here 
    if (some_value == Bar::kValue1) { 
     return Bar::kValue2; // but not here 
    } else { 
     return Bar::kValue1; 
    } 
    } 
} // namespace sample 

コンパイラは次のように定義された戻り値のタイプについて文句を言う:

error: unknown type name 'Bar'

なぜそれがその資格Foo::SomeMethodBarの戻り値の型に同じ資格を拡張しませんが、このメソッド定義でBarのすべての他の用途への資格を延長んSomeMethodの定義を与えますか? Bar以来

+0

短い答え - これは言語文法なので、 – SergeyA

+0

「なぜその言語がどのように設計されているのか」以外に、これらの*なぜ*の質問に答えるのは難しいです。 –

+0

@CaptainGiraffe「なぜこのような言葉ですか?」ではなく、「この2つの場所では構文が異なり、それ以外は何が違うのですか」という意味にしましたが、有効な点があります。 –

答えて

4
Bar Foo::SomeMethod    (Bar some_value) 
//^^^ Here is "outside" the class ^^^ Here is "inside" the class 

あなたがクラス自体の内部でもない限り、それをアクセスするためにFoo::接頭辞を使用するために必要なのクラス内で定義されています。

1

名前検索の問題です。一般的には、パラメータリストまたは関数本体に入るまで、内部でFooを自動的に参照することはできません。

namespace sample { 

    class Foo { 

    public: 

     enum Bar { 
     kValue1, 
     kValue2, 
     }; 

     Bar SomeMethod(Bar some_value); 
    }; 

    Foo::Bar Foo::SomeMethod(Bar some_value) { 
    if (some_value == Bar::kValue1) { 
     return Bar::kValue2; 
    } else { 
     return Bar::kValue1; 
    } 
    } 
} //namespace sample 

int main() {} 
関連する問題