문제

C++는 여러 파일에 걸쳐 템플릿을 선언할 때 다소 짜증나는 것 같습니다.보다 구체적으로, 템플릿 기반 클래스로 작업할 때 링커는 단일 컴파일러 개체 파일에 있는 클래스에 대한 모든 메서드 정의를 기대합니다.헤더, 기타 선언, 상속 등을 고려하면 상황이 정말 복잡해집니다.

여러 파일에 걸쳐 템플릿 기반 멤버 정의를 구성하거나 재배포하기 위한 일반적인 조언이나 해결 방법이 있습니까?

도움이 되었습니까?

해결책

여러 파일에 걸쳐 템플릿 기반 멤버 정의를 구성하거나 재배포하기 위한 일반적인 조언이나 해결 방법이 있습니까?

예;하지 않다.

C++ 사양에서는 컴파일러가 전체 템플릿(선언)을 "볼" 수 있도록 허용합니다. 그리고 정의) 인스턴스화 시점에 그리고 (구현의 복잡성으로 인해) 대부분의 컴파일러는 이 요구 사항을 유지합니다.결과적으로 모든 템플릿 헤더의 #inclusion은 템플릿을 인스턴스화하는 데 필요한 모든 소스도 #include해야 한다는 것입니다.

이를 처리하는 가장 쉬운 방법은 가능한 경우 인라인으로, 필요한 경우 라인 외부에서 모든 것을 헤더에 덤프하는 것입니다.

이것이 용납할 수 없는 모욕이라고 생각한다면 일반적인 옵션은 템플릿을 일반적인 헤더/구현 쌍으로 분할한 다음 헤더 끝에 구현 파일을 #include하는 것입니다.

C++의 "내보내기" 기능은 다른 해결 방법을 제공할 수도 있고 제공하지 않을 수도 있습니다.이 기능은 제대로 지원되지 않고 제대로 정의되지 않았습니다.원칙적으로는 일종의 별도의 템플릿 컴파일을 허용해야 하지만 컴파일러가 전체 템플릿 본문을 볼 수 있어야 한다는 요구를 반드시 없애는 것은 아닙니다.

다른 팁

얼마나 많은 파일에 걸쳐?클래스 정의를 구현과 분리하려면 다음을 시도하십시오. 이 기사 C++ FAQ에서.이것이 내가 현재 작동하는 유일한 방법이지만 일부 IDE(예: Eclipse CDT)는 이 방법을 제대로 연결하지 않아 많은 오류가 발생할 수 있습니다.그러나 자신만의 makefile을 작성하거나 Visual C++를 사용하는 것은 항상 나에게 효과적이었습니다 :-)

컴파일러가 C++0x를 지원하는 경우 extern 키워드는 정의에서 템플릿 선언을 분리하는 데 사용될 수 있습니다.

보다 여기 간단한 설명을 위해.

또한 섹션 6.3, "분리 모델" C++ 템플릿:완전한 가이드 David Vandevoorde와 Nicolai M.Josuttis는 다른 옵션을 설명합니다.

alt text

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