문제

이 코드에서 컴파일러는 다음에 대해 불평합니다. 한정되지 않은 MyClassB, 이는 이해할 수 있습니다.

class MyClassA;
class MyClassB;

template <class T> class BaseClass : public T {
};

class MyClassA : public BaseClass<MyClassB> {
};

class MyClassB : public BaseClass<MyClassA> {
};

하지만 이 코드에서 컴파일은 성공하고 불평하지 않습니다 ~에 대한 MyClassB :

class MyClassA;
class MyClassB;

template <class T> class BaseClass : public T {
};

class MyClassA : public BaseClass<std::vector<MyClassB>> {
};

class MyClassB : public BaseClass<std::vector<MyClassA>> {
};

두 번째 코드가 컴파일되는 이유 MyClassB 생성할 때 아직 정의되지 않았습니다. std::vector<MyClassB>?

도움이 되었습니까?

해결책

귀하의 구현 때문에 std::vector 불완전한 유형을 허용합니다.이는 클래스 템플릿 멤버 함수의 인스턴스화 규칙에 따른 부작용입니다.사용될 때까지 인스턴스화되지 않습니다.그래서 그 기능은 하다 완전한 유형이 필요하지만 아직 인스턴스화되지 않았습니다.따라서 오류가 없습니다.

반대로 기본 클래스가 되려면 완전한 유형이어야 하므로 이 경우 오류가 발생합니다.


그러나 불완전한 유형을 전달하는 것은 실제로 정의되지 않은 동작입니다. std::vector (또는 다른 표준 라이브러리 컨테이너), "작동합니다"는 정의되지 않은 유효한 결과입니다.당신은 그것을해서는 안됩니다.

다른 팁

"Nofollow"> 호기심 답게 되풀이 템플릿 패턴

Per BaseClass 클래스는 템플릿 인수를 기본 클래스로 사용합니다. 이는 완전한 유형이 필요합니다.

코드의 두 번째 버전은 템플릿 인수를 다른 템플리트로 전달하기 만하면 두 번째 템플릿이 완전한 유형이 필요한 것에 필요한 것은 아닌 경우 불완전한 유형이 허용됩니다.완전한 유형을 필요로하는 어떤 방식 으로든 논쟁을 사용한 경우에는 허용되지 않습니다.

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