2010-04-01 6 views
1

C++로 Apache 모듈을 작성하고 있습니다. 모든 어린이가 공유 메모리의 일부로 읽을 필요가있는 공통 데이터를 저장해야합니다. 구조는 일종의 벡터지도입니다. 그래서 STL지도와 벡터를 사용하고 싶습니다. 나는 (두 번째 개체를 사용하려고하면 시간이 오류를 컴파일 얻을공유 메모리 STL 맵

typedef vector<CustomersData, SharedAllocator<CustomersData> > CustomerVector; 
CustomerVector spData; //this one works fine 

typedef SharedAllocator< pair< const int, CustomerVector > > PairAllocator; 

typedef map<int, CustomerVector, less<int>, PairAllocator > SharedMap; 

SharedMap spIndex; //this one doesn't work< 

: 나는 그들이 벡터에 대한하지만 맵 잘 작동 공유 할당 및 목적으로 공유 관리자를 작성한 아래의 예이다 가 someting 등이있다 spIndex는) :

그것은 내 의견으로는 이상하다 SharedMap 템플릿 유형에 대한 유형을 확인할 수없는 컴파일러처럼 보이는

../SpatialIndex.h:97: error: '((SpatialIndex*)this)->SpatialIndex::spIndex' does not have class type

, 모든 템플릿 매개 변수가 지정되었는지 날 것으로 보인다.

도와 주시겠습니까?

감사 벤 베누

안녕하세요, 귀하의 의견을 주셔서 감사합니다.

SpatialIndex는 기본적으로 컨테이너 (SpatialIndex의 SharedMap spIndex)와 update 및 getData의 두 가지 컨테이너로 만들어진 컨테이너를 포함하는 클래스입니다. 업데이트 방법 다음 코드 줄 이내에서

는 위의 컴파일러 오류를 제공합니다 : 마지막 줄의 sintax 다양한

int spKey = this->calculateSpKey(customer.getLat(), customer.getLong()); 
this->spIndex[spKey].push_back(customer); 

컴파일러가 제공하는 오류를 다양하지만, 기본적으로는 이해할 수없는 것을 말한다 유형 변수 spIndex가이거나이 클래스에 대해 적절한 오버로드 생성자를 찾을 수 없습니다.

+1

오신 것을 환영합니다 다음 줄에서 '명시 적'단어를 삭제 해결되었다. 4 칸 또는 1 탭을 들여 쓰기하여 코드를 포맷하십시오. – kennytm

+0

'SpatialIndex' 타입은 어떻게 생겼습니까? 이 중 하나가 다른 클래스 안에 선언되어 있습니까? – Thomas

+0

'(SpatialIndex *) this'는 _really_ 나쁜 생각입니다.캐스트를 절대적으로 필요로한다면'static_cast'를 사용하여 우연히'reinterpret_cast'를 수행하거나 우연히 const-qualifier를 제거하지 않도록하십시오. –

답변

2

spIndex를 초기화하는 행을 게시하십시오. '클래스 유형이 없습니다'라는 컴파일러 오류는 일반적으로 필드 인 것처럼 함수를 참조하고 있음을 의미합니다.이 경우 컴파일러가 함수에 대해 spIndex를 어떻게 든 오해 한 것일 수 있습니다. 나는 코드를 보지 못했지만 가장 Vexing Parse가 어떻게 든 올 것이라고 확신합니다. 도움을 주셔서 대단히

0

덕분에, 초기화 라인은 따라서 위의 모든 문제에 대한 선도, 실제로

SharedMap 개체를 두 개의 매개 변수를 리턴 함수로 컴파일러에 의해 해석 된
SharedMap spIndex(less<int>(), PairAllocator); 

했다. 이 라인 변경 : 더 intelegible 오류로

SharedMap spIndex; 

리드, 종류의 '내부적으로 STL ::지도를 관리하는 stl_tree 개체에 대한 적절한 생성자를 찾을 수 없습니다'.

이 다른 오류

은 ... 나는 그것을 단지 상용구 코드를 고려 잘못
inline explicit SharedAllocator(SharedAllocator const&) {} 

template<typename U> 
inline explicit SharedAllocator(SharedAllocator<U> const&) {} 

SharedAllocator.h