2014-12-15 5 views
1

안녕하세요, 저는 일부 리소스를 사용하여 사용자 정의 할당자를 작성했습니다. std :: vector, list에서 잘 작동합니다. 그러나 std :: unordered_map의 경우 생성자는 두 번 호출됩니다. 나는 왜 그런 것이 아니다. 수있는 누군가가 내게 일어나는 정적 초기화 이해 도와주세요. helper.hC++ 사용자 지정 할당 자

template<typename T> 
class helper 
{ 
static const size_t init_size = 12; // 0xF4240 max number of entries in the data structure 
public: 
     helper() : 
     alloc_size(
     sizeof(link) > sizeof(T) ? 
     init_size * sizeof(link) : init_size * sizeof(T)), offset(
     sizeof(link) > sizeof(T) ? sizeof(link) : sizeof(T)) 
    { 
     std::cout <<"Initial allocation done" << " I value : " << i << std::endl; 
    } 


}; 

파일 : MAIN.CPP

int main() 
{ 
    std::unordered_map<long,long,hash<long>, equal_to<long> , myallocator<pair<const long,long> > >   my_map; 
} 

그런 식으로이 프로그램에 twiced 호출되는 constrcutor 도우미하게 그것을 호출 다음 코드

파일입니다. 그것은 벡터와 같은 일은 아닙니다. 템플릿 초기화에 관해서 내가 이해하지 못하는 것이 있습니까? 제발 도와주세요

+0

- 1 : "constrcutor"? 어느 것? 실제로 컴파일하는 http://stackoverflow.com/help/mcve를 게시하십시오. 예상되는 출력과 얻은 결과를 모두 포함하십시오 ** ** 정확하게 **. "질문하는 방법"도움말 페이지를 읽었습니까? 그들은 그것을 통해 당신을 걸어야합니다. – Yakk

+0

제안에 감사드립니다. 나는 변화를 만들었다. – user4362837

답변

2

컨테이너는 제공된 유형뿐만 아니라 rebind을 통해 다른 유형의 할당자를 생성 할 수 있습니다. 이것은 분명히 귀하의 경우에 발생합니다. 다른 사람들이 컴파일하고 확인할 수 있도록 충분한 코드를 제공하지 않은,하지만 당신은 helper의 생성자이를 추가 할 수 있습니다

std::cout << __PRETTY_FUNCTION__ << std::endl; 

이 GCC와 연타에서 작동하고 함수/클래스이었다 템플릿 매개 변수를 표시합니다 와 함께 인스턴스화.

+0

suggetion에 감사드립니다. 헬퍼 생성자에 넣으려고했는데 다음과 같은 결과가 나옵니다. T = std :: __ detail :: _ Hash_node_base *와 함께 호출 된 다음 T = std :: __ detail :: _ Hash_node 로 호출됩니다. 왜 그렇게합니까? 감사합니다 – user4362837

+0

@ user4362837 때문에 다른 유형의 개체를 만들 필요가 ... –

관련 문제