2011-10-23 3 views
1

나는 서로 다른 클래스들을 모두 계층 구조로 배열했다. 코드 양을 줄이기 위해 필자는 템플릿 기능을 만들기 시작했습니다. 기본 클래스는 템플릿 함수를 사용하고 일부 파생 클래스는 동일한 함수를 사용합니다. 내가 그런 것처럼 정의되지 않은 참조 문제가 생기지 않도록 이러한 템플릿을 모두 넣을 수 있습니까? 모든 정의를 헤더 파일에 넣은 다음 함수를 호출하는 클래스의 .cpp 부분에 헤더 파일을 포함시켜야합니다. 그게 효과가 있니? 지금 당장은 모든 클래스 (class.cpp, class.h)가 잘 컴파일되지만 링크하는 동안 모든 것이 불어납니다. 모든 템플릿을 네임 스페이스에 넣고 그 네임 스페이스를 모든 클래스의 구현에 포함 시키려고했지만 작동하지 않습니다. 내 질문은, 당신은 어떻게 모든 클래스가 데이터 멤버에 사용할 수있는 템플릿 함수를 보유하고 별도의 엔티티를 만드는 것에 대해 갈 것이라고?(C++) 내 템플릿은 어디에 둘까요?

+0

[템플릿을 헤더 파일에만 구현할 수있는 이유는 무엇입니까?] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header- 파일) –

답변

1

나는이 문제로 많은 사람들을 혼란스럽게 보았습니다. 템플릿은 유형이 아닙니다. 인스턴스화 될 때 유형이됩니다. 이러한 이유 때문에 템플리트의 구성원은 사용하려는 동일한 데이터 단위에 있어야합니다.

템플릿이 일반적이고 모든 코드에서이 템플릿을 사용하려면 헤더 파일에 모든 것을 넣기 만하면됩니다.

선언과 정의 및 구현을 모두 동일한 파일에 표시하는 것을 좋아하지 않는다면 템플릿을 두 개의 다른 파일로 나눌 수 있습니다.

예를 들어, 선언과 함께 "list.h"및 구현과 함께 "list.inc".

작동하려면 두 가지를 모두 포함해야합니다.

2

템플릿 함수 및 템플릿 클래스의 정의는 .cpp 파일이 아니라 헤더 파일에 속합니다.

이것은 컴파일러가 기본적으로 헤더에있는 파일에 사용 된 각 템플릿 매개 변수 집합에 대해 새로운 기능을 생성해야하기 때문입니다. 템플릿 함수가 .cpp 파일에 정의 된 경우, 호출 코드가 어떻게 생겼는지 모른 채 모든 함수 버전을 생성해야하며 기본적으로 불가능합니다. (이런 식으로 템플릿 함수의 중복 정의를 얻지 만, 링커는 그것들을 제거하고 최종 바이너리에서 각각의 템플릿 인스턴스화가있을 경우 단 하나의 복사본 만 만들도록합니다.)

관련 문제