나는 다음과 같은 파일 무리가 있다고 가정 버전을 사용하여 사용 편의성을 단순화합니다.올바른 앞으로 선언
#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;
}
. 일부 사용자의 경우 SpecialMap
의 GenericMap
으로 충분해야합니다. 사용 편의성을 위해 typedef
이 사용됩니다.
이제 Client
은 내부적으로 SpecialMap
을 사용하지만 헤더 파일은 SpecialMap
에 대한 전달 선언 만 선언해야합니다.
다음 파일은 컴파일되지 않습니다. 어떻게 든 게시 된 포워드 선언으로 충분합니다. 올바른 것은 무엇입니까?
긴 목록에는 유감이지만 생각할 수있는 가장 작은 비 실용적인 예였습니다.
그냥 따로 :'#pragma once'는 권장하지 않습니다. 이식성을 위해'#ifndef ... #define ... #endif' 패턴을 사용하십시오. – erip
'typedef '는 전문화를 선언하지 않습니다. –
힌트를 보내 주셔서 감사합니다. 우리 회사는 Visual Studio 만 사용합니다. 이식성 문제는 없습니다. :-) – Aleph0