2017-09-06 2 views
0
template <typename T> 
class linked; 

template <typename T> 
class node { 
    ... 
    friend class linked<T>; 
}; 

template <typename T> 
class linked { 
    ... 
}; 

사용 주하지만 지금은에 대해 다른 .H 및 .CPP 파일을 만들고 싶어 각 클래스. 나는 그들에게 어떻게 선언 할 것인가?앞으로 선언 친화적 클래스에게 내가 앞으로 연결 클래스를 선언 한

+3

이러한 템플릿 클래스 파일을 cpp를 만드는 아무 소용이 없다로서

편집 . [템플릿은 헤더에 구현해야합니다 *] ​​(https://stackoverflow.com/q/495021/501250) (필요한 모든 인스턴스화를 명시 적으로 인스턴스화하지 않는 한 거의 좋은 개념이 아닙니다.) 템플릿 클래스 멤버를 인스턴스화하기 위해서는 템플릿 클래스 멤버의 정의를 알아야합니다. – cdhowie

+0

만약 내가 당신이라면 나는'node'를 구조체로 선언하고 그것의 모든 멤버를 public으로 선언 할 것입니다. 편의성 객체이므로 액세스 제어가 필요하지 않습니다. – NathanOliver

+0

@cdhowie 나는 다른 코드를 가지고있다. 이것은 이것의 단순화 된 버전이다. 그리고 나에게는 각 클래스마다 다른 cpp 파일을 만들어야한다. 전달 선언 또는 이와 유사한 것을 구현하는 방법 –

답변

0

템플릿의 전체 선언을 .h 파일로 간주하는 것이 좋습니다.

당신이 그들을 분리해야하는 경우 수 :

linked.h :

template <typename T> 
class linked; 
#include "linked_implementation.tpp" 

linked_implementation.tpp : 의견

+0

'linked_implementation.cpp'가 프로젝트에 컴파일 할 파일로 추가되지 않도록해야한다고 명시해야합니다. – NathanOliver

+0

@NathanOliver는 불필요한 작업 외에도'linked_implementation.cpp'를 컴파일 할 때 단점이 있습니까? – Kevin

+0

나는 @NathanOliver가 언급 한 이유 때문에'cpp' 확장을 완전히 사용하지 않을 것입니다. 일부 IDE는 자동으로'cpp' 파일을 빌드합니다.이 경우에는 중단됩니다. 대부분의 사람들은 클래스 템플릿 구현을 위해'tpp' 또는'hpp'를 사용합니다. – 0x5453

1

node.hpp에 따라

#ifndef LINKED_IMPLEMENTATION_TPP 
#define LINKED_IMPLEMENTATION_TPP 

template <typename T> 
class node { 
    ... 
    friend class linked<T>; 
}; 

template <typename T> 
class linked { 
    ... 
}; 

#endif 

편집

012 linked.hpp 포함하지 않고

linked.hpp

#pragma once 
#include "node.hpp" // just because I guess you will use it in linked implementation 
template <typename T> class linked { 
... 
}; 

그래서 당신은 사용 노드를 유지할 수 있습니다. 개인 헤더를 보관할 수도 있으며 사용자에게 제공하지 않습니다. 그러나 어떤 코드가 링크 된 클래스를 사용하고자한다면 linked.hpp 만 포함하면됩니다. 옵션 node.hpp

#pragma once 

template <typename T> class node { 
... 
class linked; 
friend class linked<T>; 
}; 

linked.hpp

#pragma once 
#include "node.hpp" 
template <typename T> class node<T>::linked { 
... 
};