2014-05-10 2 views
-2

템플릿 선언 중에 .h 끝에 .cpp을 추가해야하는 이유에 대해 감히 대답하지 않습니다. 그것은 StackOverflow에서 여러 번 답변을 얻었 기 때문입니다.왜 템플릿 헤더 끝에 .cpp를 추가하는 순환 의존성이 아닌가요?

하지만 내 질문은, 어떻게하지 순환 종속성, 또는이다 와서 컴파일러 내가 헤더의 끝에서 .CPP을 추가 할 때, .cpp.h.cpp.h 추가에 보관하지 않는 방법?

C++ 11은 이상한 템플릿 요구 사항을 해결하려고합니까?

@Edit : 그냥 헤더 파일

#ifndef MYMAP 
#define MYMAP 

#include <iostream> 
#include <string> 

using namespace std; 

template<typename ValType> 
class MyMap 
{ 
public: 
    MyMap(); 
    ~MyMap(); 

    void add(string key, ValType val); 
    ValType getValue(string key); 

private: 

    static const int NumBuckets = 99; 

    struct cellT 
    { 
     string key; 
     ValType val; 
     cellT* next; 
    }; 

    cellT *buckets[NumBuckets]; 

    int hash(string key, int numBuckets); 

    cellT* findCellForKey(string key, cellT *head); 

    MyMap(MyMap&); 
    MyMap operator = (MyMap&); 


}; 

#include "MyMap.cpp" //included .cpp 

#endif 

@Edit이 포함 : MyMap.cpp

#include "MyMap.h" 

//rest of the code 

감사합니다.

#ifndef MYMAP 
#define MYMAP 
... 
#endif 

.h가 포함 된 두 번째는, 효과적으로이다 MYMAP 이후에는 조합이 없었다 :이 기술의 장점을 차치

답변

5

, 질문의 코드 때문에 포함 가드의 작동 처음으로 라운드를 정의했다.

P. 헤더 파일에 using namespace std을 사용하지 마십시오. 이 헤더를 포함하는 모든 코드는 전체 std 네임 스페이스가 원하는지 여부에 관계없이 현재 범위로 가져옵니다.

+0

'이 기술의 장점을 버리는 것'.. 더 좋은 기술이 있다면 제안 해주세요. –

+1

@pranitkothari : 기본 옵션은 전체 템플릿 코드를'.h' 파일에 넣어야한다고 생각합니다. 구현을'.cpp' 파일에 넣음으로써 달성하고자하는 것이 무엇인지 완전히 명확하지 않습니다. – NPE

+0

사실. 나는 모든 것을 인라인 할 수 있었다. –