2016-07-07 2 views
2

나는 다음과 같은 파일 무리가 있다고 가정 버전을 사용하여 사용 편의성을 단순화합니다.올바른 앞으로 선언

#pragma once 

#include "Generic.h" 
#include <string> 
#include <map> 

typedef GenericMap<std::string, int, std::map> SpecialMap; 

Client.h : SpecialMap를 사용하고 선언을 앞으로 정의 클라이언트.

#pragma once 

class SpecialMap; // Wrong forward declaration 

struct Client { 
    Client(); 
    SpecialMap* map; 
}; 

Client.cpp가 :

#include <Client.h> 

int main(int argc, char**args) { 
    Client c; 
    return 0; 
} 

GenericMap 더 앞으로 선언이없는 템플릿 클래스를 나타냅니다 클라이언트 코드가 Generic.h를 알 수 있으며 Special.h MAIN.CPP

#include "Client.h" 
#include "Special.h" 

Client::Client() 
{ 
    map["343"] = 2; 
} 

. 일부 사용자의 경우 SpecialMapGenericMap으로 충분해야합니다. 사용 편의성을 위해 typedef이 사용됩니다.

이제 Client은 내부적으로 SpecialMap을 사용하지만 헤더 파일은 SpecialMap에 대한 전달 선언 만 선언해야합니다.

다음 파일은 컴파일되지 않습니다. 어떻게 든 게시 된 포워드 선언으로 충분합니다. 올바른 것은 무엇입니까?

긴 목록에는 유감이지만 생각할 수있는 가장 작은 비 실용적인 예였습니다.

+0

그냥 따로 :'#pragma once'는 권장하지 않습니다. 이식성을 위해'#ifndef ... #define ... #endif' 패턴을 사용하십시오. – erip

+0

'typedef '는 전문화를 선언하지 않습니다. –

+0

힌트를 보내 주셔서 감사합니다. 우리 회사는 Visual Studio 만 사용합니다. 이식성 문제는 없습니다. :-) – Aleph0

답변

1

의견에서 당신은 실제로 C++ 전문화를 언급하지 않는다는 것을 분명히했습니다. 당신은 typedef에 대해서만 묻고 있습니다 :

typedef GenericMap<std::string, int, std::map> SpecialMap; 

그리고 그것은 거의 이야기의 끝입니다. 이렇게하면 SpecialMap이 유형 별칭 인 typedef으로 선언됩니다. SpecialMap을 사용해야하는 번역 단위는이 유형 정의를 포함해야합니다. 그리고이 정의 만. 그 밖의 일은 할 필요가 없습니다. 다른 방법으로 선언 할 필요는 없습니다. 별칭입니다. typedef 별칭을 기본 유형으로 검색/바꾸면 똑같은 결과가 산출됩니다. 한 번역 단위에서 선언 된 typedef은 해당 번역 단위에서만 볼 수 있습니다. 해당 범위에 typedef을 가져올 다른 번역 단위에 대한 바로 가기가 없습니다. 당신의 Client.h에서

:

typedef을 정의하고이 정의에 풀 수있는 유일한 방법입니다 어디
#include <Special.h> 

.

그러나 이것은 또한 typedef이 더 큰 헤더 파일의 일부인 경우 일 수 있으며, typedef 만 별도로 가져 오는 것이 바람직합니다. 이것은 헤더 파일 만 포함하여 수행 할 수 있습니다 :

#include <string> 
#include <map> 

template<typename K, typename V, 
     template<typename Key, typename Value, typename ...> 
      typename C> struct GenericMap; 

typedef GenericMap<std::string, int, std::map> SpecialMap; 

이는 typedef 별칭을 정의하는 데 필요한 최소한의 것입니다. 실제로이 헤더 파일을 사용해야하는 경우에는이 헤더 파일뿐만 아니라 실제로 GenericMap 템플릿 클래스를 정의하는 Generic.h 헤더가 있어야합니다.이 헤더 파일은 여기에서 앞으로 선언 된 것입니다. #include

+0

많은 감사. 그것은 정말로 나의 문제를 해결하고 명백하게합니다. 아래의 코드를 새로운 헤더 파일'SpecialMapFwd.h '에 포함시킵니다. – Aleph0

+0

'GenericMap'이 typedef'typedef C map_type'을 포함하고있을 때 내가해야 할 일을 파악하려고합니다. 'map_type'을 어떻게 선언 할 수 있을까요? – Aleph0

+0

기본 클래스를 정의하지 않고 클래스 멤버를 전달할 수는 없습니다. –