내부 수업을 선언하는 방법은 무엇입니까? [복제하다
-
06-07-2019 - |
문제
가능한 복제 :
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 기반이며 수출을 구현하기를 바랍니다)).
제휴하지 않습니다 StackOverflow