2016-10-13 4 views
2

나는 다음과 같은 코드가 있습니다 함수 밖에서 함수 중첩 클래스의 구현을 어떻게 정의합니까?

class A { 
    void foo() { 
    class B { 
     void bar() { std::cout << "Bar!" << endl; } 
    }; 
    B b; 
    } 
}; 

그러나 나는 기능 범위의 구조체 B 외부를 구현하고 싶습니다. 이 A 단지 중첩 클래스라면 내가 좋아하는 뭔가를 할 수 :

class X { 
    void foo(); 
    class Y; 
} 
class X::Y { 
    void bar() { std::cout << "Bar!" << endl; } 
} 

을하지만 클래스 B에 대한 비슷한 일을 할 수있는 경우에는 내가 운동을 할 수 없다. 컴파일러는 그 클래스의 유형 A::foo::B하지만 난 내가 foo 것을 이야기하고 그 클래스를 정의하려고하면 A의 구성원이 아닌 것을 저에게 말한다 :

시도 :

class A { 
    void foo(); 
}; 

class A::foo::C { 
    void bar() { std::cout << "Bar!" << std::endl; } 
}; 

void A::foo() { 
    class C; 
    C c; 
    c.bar(); 
} 

오류 :

test.cpp(15) : error C3083: 'foo': the symbol to the left of a '::' must be a type 
test.cpp(15) : error C2039: 'C' : is not a member of 'A' 
    test.cpp(6) : see declaration of 'A' 
test.cpp(19) : error C2079: 'c' uses undefined class 'A::foo::C' 
+4

첫번째 예제에서'B' 클래스가 실제로'A' 클래스 안에 중첩되어 있지 않기 때문에 불가능합니다. 'A :: foo' 함수 내부에 로컬이므로 전체 정의가 그 함수 안에 있어야합니다. –

+0

'B'가'bar' 메소드에 대해 로컬이기 때문에 불가능합니다. –

+0

파일 스코프의 이름이없는 네임 스페이스에'B'를 넣습니다. – Jarod42

답변

2

그건 불가능합니다. C 이름은 foo 기능 범위 외부에 표시되지 않습니다. 그리고 클래스와 달리, 이제는 함수 밖에서 함수 범위에 도달하는 방법이 있습니다.

예를 들어 A은 전혀 관련이 없습니다. foo이 네임 스페이스 범위 함수이면 결과는 완전히 동일합니다.

함수 로컬 클래스를 원하면 해당 함수 내에 완전히 구현해야합니다.

관련 문제