문제

가능한 복제 :
C ++에서 중첩 유형/클래스의 선언 선언

나는 그렇게 같은 수업이 있습니다 ...

class Container {
public:
    class Iterator {
        ...
    };

    ...
};

다른 곳에서는 참조로 컨테이너를 전달하고 싶지만 헤더 파일을 포함시키고 싶지 않습니다. 클래스를 선언하려고하면 컴파일 오류가 발생합니다.

class Container::Iterator;

class Foo {
    void Read(Container::Iterator& it);
};

위의 코드를 컴파일하면 ...

test.h:3: error: ‘Iterator’ in class ‘Container’ does not name a type
test.h:5: error: variable or field ‘Foo’ declared void
test.h:5: error: incomplete type ‘Container’ used in nested name specifier
test.h:5: error: ‘it’ was not declared in this scope

반복자 클래스를 선언하는 헤더 파일을 포함 할 필요가 없도록이 클래스를 선언하는 방법은 무엇입니까?

도움이 되었습니까?

해결책

이것은 단순히 불가능합니다. 컨테이너 외부에 중첩 된 구조를 선언 할 수는 없습니다. 컨테이너 내에서만 선언 할 수 있습니다.

다음 중 하나를 수행해야합니다

  • 클래스를 네 가지로 만들었습니다
  • 중첩 클래스가 먼저 정의되도록 선언 순서를 변경하십시오.
  • 함수에서 사용하고 중첩 클래스에서 구현할 수있는 공통 기본 클래스를 만듭니다.

다른 팁

나는 불완전한 클래스 작품에서 내부 클래스를 선언한다고 믿지 않습니다 (클래스 정의가 없으면 실제로 있는지 알 수있는 방법이 없기 때문입니다. ~이다 내부 클래스). 따라서 선언 된 내부 클래스와 함께 컨테이너의 정의를 포함시켜야합니다.

class Container {
public:
    class Iterator;
};

그런 다음 별도의 헤더에서 컨테이너를 구현하십시오 :: iterator :

class Container::Iterator {
};

그런 다음 #컨테이너 헤더 만 포함하십시오 (또는 전방 선언에 대해 걱정하지 않고 둘 다 포함).

나는 당신이 원하는 것을 정확하게 할 수있는 방법이 없다는 것을 알고 있지만, 여기에 템플릿을 기꺼이 사용하려는 경우 해결 방법이 있습니다.

// Foo.h  
struct Foo
{
   export template<class T> void Read(T it);
};

// Foo.cpp
#include "Foo.h"
#include "Container.h"
/*
struct Container
{
    struct Inner { };
};
*/
export template<> 
  void Foo::Read<Container::Inner>(Container::Inner& it)
{

}

#include "Foo.h"
int main()
{
  Foo f;
  Container::Inner i;
  f.Read(i);  // ok
  f.Read(3);  // error
}

바라건대,이 관용구는 당신에게 약간의 사용이 될 수 있기를 바랍니다 (그리고 당신의 컴파일러는 EDG 기반이며 수출을 구현하기를 바랍니다)).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top