라인 외부 멤버 함수 정의에 필요한 정규화 된 클래스 이름이 전역 범위에 해당합니까?


14

질문은 클래스 외부 멤버 함수 정의에서 클래스 이름 (전역 범위 연산자 포함)을 정규화하는 것이 유용하고 필요한지 궁금합니다.

한편으로, 나는 이것을 전에 본 적이 없다. (그리고 올바르게 구문하는 것이 모호한 것처럼 보인다). 다른 한편으로, C ++ 이름 조회는 사소한 것이 아니기 때문에 코너 케이스가 존재할 수 있습니다.

질문:

에 의한 클래스 외부 멤버 함수 정의를 도입하는
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
것이
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }(전역 범위 ::접두어 없음) 과 다른 경우가 있습니까?

그래서 멤버 함수의 정의는, 클래스를 둘러싸는 공간에 넣어해야합니다 유효한 예가 아니다.


downvoter가이 질문에 대해 싫어하는 점이 매우 궁금합니다. 피드백 환영합니다!
맥스 랭 호프

정의가 선언과 다른 네임 스페이스에 배치 될 때 내가 링크 한 질문에 대해 내가 염두에
두었던 것


@ formerlyknownas_463035818 그것은 또한 내가 생각한 것인데, 시도하고 작동하지 않는다는 것을 깨달았으므로 질문을 썼습니다 (다른 사람들도 궁금해 할 것입니다).
맥스 랭 호프

답변:


12

사용-지시문을 일으킬 수 있습니다 Fully자격이없는 모호 할 수 있습니다.

namespace Foo {
    struct X {
    };
}

using namespace Foo;
struct X {
    void c();
};

void X::c() { } // ambiguous
void ::X::c() { } // OK

5

사람이 마조히스트이고 이와 같은 글쓰기를 즐기는 경우 필요합니다.

namespace foo {
    namespace foo {
        struct bar {
            void baz();
        };
    }

   struct bar {
       void baz();
   };

   void foo::bar::baz() {
   }

   void (::foo::bar::baz)() {
   }
} 

물론 foo::foo::bar::baz전역 범위에서 와 같이 두 번째 오버로드를 작성할 수 있지만 문제는 두 선언이 다른 의미를 가질 수 있는지 여부입니다. 그런 코드를 작성하지 않는 것이 좋습니다.


예, 이것은 실제로 유효한 답변이며조차 필요하지 않습니다 using. 다른 사례를 강조 표시하는 것이 좋습니다!
맥스 랭 호프

2

using 지시문을 사용하면 혼동되는 코드가있을 수 있습니다.

다음과 같은 실증 프로그램을 고려하십시오

#include <iostream>
#include <string>

namespace N1
{
    struct A
    {
        void f() const;
    };      
}

using namespace N1;

void A::f() const { std::cout << "N1::f()\n"; }

struct A
{
    void f() const;
};

void ::A::f() const { std::cout << "::f()\n"; }

int main() 
{
    N1::A().f();
    ::A().f();

    return 0;
}

가독성을 위해이 정규화 된 이름

void ::A::f() const { std::cout << "::f()\n"; }

함수가 선언 된 위치를 정확하게 보여줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.