문제

내가 작성한 코드에 정말 불쾌한 문제가 있습니다. 나는 stackoverflow에서 같은 문제가있는 다른 사람을 발견했고 솔루션을 시도했지만 아무도 나를 위해 일하지 않았습니다.

나는 내가 사용하는 몇 가지 일반적인 STL 유형을 입력했으며지도를 입력하려고 할 때를 제외하고는 아무런 문제가 없습니다. "some_file.h : 83 : 오류 : 테스트 프로그램에 헤더를 포함시킬 때 '<'토큰"오류가 발생하기 전에 예상 초기화기를 얻습니다.

헤더의 중요한 부분 (some_file.h)은 다음과 같습니다.

#ifndef SOME_FILE_H
#define SOME_FILE_H
// some syntax-correct enums+class prototypes
typedef std::string str;
typedef std::vector<Column> col_vec;
typedef col_vec::iterator col_vec_i;
typedef std::vector<Row> row_vec;
typedef row_vec::iterator row_vec_i;
typedef std::vector<str> str_vec;
typedef str_vec::iterator str_vec_i;
typedef std::vector<Object> obj_vec;
typedef obj_vec::iterator obj_vec_i;
typedef std::map<Column, Object> col_obj_map; // error occurs on this line
typedef std::pair<Column, Object> col_obj_pair;

some_file.cpp의 포함은 다음과 같습니다.

#include <utility>
#include <map>
#include <vector>
#include <iostream>
#include <string>
#include <stdio.h>
#include <cc++/file.h>
#include "some_file.h"

테스트 파일에는 단순히 문자열, 벡터 및 내 파일이 해당 순서대로 포함됩니다. 그것은 Hello World 종류를하는 주요 방법이 있습니다.

재미있는 점은 문제가 어디에 있는지 확인하기 위해 템플릿 클래스를 빨리 던졌다는 것입니다.std::map<Column..." 와 함께 "hello<Column...") 문제없이 작동했습니다.

나는 당신이 a '가없는 클래스를 사용하는 경우 맵에서 요구하는 연산자 과부하를 이미 만들었습니다.<' 운영자.

도움이 되었습니까?

해결책

컴파일러가 맵이 무엇인지 모르기 때문에이 문제가 발생합니다. 맵 헤더가 아직 포함되지 않았기 때문에 모릅니다. 헤더는 stl 템플릿을 사용합니다 : 문자열, 벡터, 맵, & 페어. 그러나 정의하지 않거나 정의 된 위치에 대한 참조가 없습니다. 문자열이나 벡터가 아닌 맵에있는 테스트 파일 바프가 sode _file.h 전에 문자열과 벡터 헤더를 포함하기 때문에 문자열과 벡터가 정의되지만 맵은 그렇지 않기 때문입니다. Map의 헤더를 포함하면 작동하지만 특정 STL 구현에 MAP 헤더에 쌍이 포함되지 않는 한 쌍에 대해 불평 할 수 있습니다.

일반적으로 가장 좋은 정책은 자신의 헤더에 사용하는 모든 유형에 적합한 표준 헤더를 포함시키는 것입니다. 그래서 some_file.h는 적어도이 헤더를 가져야합니다.

#include <string>
#include <map>
#include <utility> // header for pair
#include <vector>

이 접근법의 단점은 전처리 기가 매번 각 파일을로드하고 #ifdef ... #endif 조건부 포함 처리이므로 수천 개의 파일이 있고 각 파일에 수십 개의 포함이 있으면 컴파일 시간이 크게 증가 할 수 있습니다. 그러나 대부분의 프로젝트에서 헤더 포함을 수동으로 관리해야한다는 추가 악화는 편집 시간의 소형 이득의 가치가 없습니다. 그래서 Scott Meyers의 효과적인 STL 책은 "항상 #include the headers"를 가지고 있습니다. 항목 #48.

다른 팁

a #include <map> 헤더 파일 어딘가에?

적어도 그것이 작동하는지 확인하기 위해 거기에 넣으십시오. 당신은 어쨌든 그렇게해야합니다.

포함 중 일부를 헤더 파일로 전환해야합니다. 이것들은 typedef 문 앞에 배치해야합니다.

#include <map>
#include <string>
#include <map>

그렇지 않으면, some_file.h (예 : 메인 프로그램)를 포함한 다른 항목은 #include "some_file.h"이전에 포함 된 내용이 포함 된 경우 기본 프로그램 소스 파일에 지시문을 포함시키기 전에 무엇이 있는지 알 수 없습니다. 이렇게하면 문제가 사라져야합니다.

몇몇 사람들이 지적했듯이 컴파일러는지도 정의를 찾지 못합니다. 당신이지도 헤더를 포함하는 것처럼 보이므로, 내가 생각할 수있는 다른 두 가지 가능한 원인이 있습니다.

  1. MAP라는 다른 헤더 파일이 STD 맵 헤더 대신로드됩니다. 나는 이것이 거의 없을 것이라고 생각합니다.
  2. 다른 헤더는 #define'ing 맵은 다른 것으로 맵입니다.

어느 쪽을 확인하는 한 가지 방법은 컴파일러가 사후 처리 된 파일을 생성하도록하는 것입니다. 즉, C 프리 프로세서를 통해 실행 된 후 소스 파일은 컴파일되기 전에 소스 파일을 생성하는 것입니다. 그런 다음 불쾌한 선을 찾아 맵 유형이 다른 것으로 대체되었는지 확인할 수 있어야합니다. 또한 파일을 다시 검색하고 #include가 무엇을 OPULL에 넣은 헤더를 볼 수 있어야합니다.

후 처리 된 파일을 생성하는 방법은 컴파일러 종속입니다. 컴파일러의 문서에서 CMD 라인 플래그를 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top