[모던C++입문] 3.2 네임스페이스와 함수 룩업

    3.2 네임스페이스와 함수 룩업

    네임스페이스

    struct global {};
    namespace c1
    {
        struct c1c{};
        namespace c2
        {
            struct c2c {};
            struct cc
            {
                global x;
                c1c y;
                c2c z;
            }
        }
    }
    
    struct same {};         //#1
    namespace c1
    {
        struct same {};     //#2
        namespace c2
        {
            struct same {}; //#3
            struct csame
            {
                ::same x;   //#1
                c1::same y; //#2
                same z;     //#3
            }
        }
    }
    
    struct same {};             //#1
    namespace c1                //#a
    {
        struct same {};         //#2
        namespace c2
        {
            struct same {};     //#3
            namespace c1 {};    //#b
            struct csame
            {
                ::same x;       //#1
                same z;         //#3
    
                c1::same y;     //오류: c1::c2::c1::same을 참조하려함
                //#b에 의해 숨겨짐 #2의 same을 선언하려면
                ::c1::same y;   //#2
            }
        }
    }
    • 자주사용하는 네임스페이스는 using을 사용하여 네임스페이스를 생략할 수 있다.

    인수 종속 룩업

    • Argument dependent look-up, ADL
    • Koenig Algorithm
    • 함수 이름 검색을 네임스페이스로 확장하기때문에 네임스페이스 한정자를 사용하지 않아도 됨
    • 다른 네임 스페이스안에 있는 이름을 가져올 떄는 ADL에 종속되지 않음
    • 오버로드가 존재할 수 있는 함수 템플릿의 네임스페이스를 한정하지 말자
    • 이름을 보이게 한정되지 않은 함수를 호출하자
    namespace c1
    {
        struct s1
        {
            int data;
        };
    
        void init(s1& s)
        {
            s.data = 0;
        }
    }
    
    int main()
    {
        c1::s1 ss;
        init(ss);   //c1::init을 하지 않아도 c1:init함수가 호출된다
    
        std::cout << ss.data << std::endl;
    
        return 0;
    }
    반응형

    댓글

    Designed by JB FACTORY