2014-04-20 4 views
2

개인 멤버 클래스 (Inner)가있는 클래스가 있습니다 (Outer). 나는 비 순정 표준 컨테이너에 Outer::Inner의 인스턴스를 저장하려고하므로 std::hash<Outer::Inner>을 전문으로하고 싶습니다. 그러나전용 멤버 클래스의 std :: hash 특수화

이 작성 :

error: 'Inner' is a private member of 'Outer' 
      std::size_t operator()(const Outer::Inner &p) const 
               ^

내가 this answer에 따라 std::hash 친구 구조체를 만들기 위해 노력했다,하지만 작동 중 하나를하지 않았다 :

namespace std { 
    template<> 
    struct hash<Outer::Inner> { 
     std::size_t operator()(const Outer::Inner &arg) const 
     { 
      return std::hash<int>()(arg.someSpecialProperty); 
     } 
    }; 
} 

컴파일러가 불평을 Outer::Inner의 전방 선언은 다음으로 실패했습니다 :

error: use of undeclared identifier 'Outer' 

그럼 어떻게해야합니까? (만약 내가하려는 일이 가능하다면)?

+1

는 : 귀하의 경우 수없는 것처럼 당신이 친구를 추가 할 수 없기 때문에 http://stackoverflow.com/questions/8760181/friend-within-private-nested-class이 보인다 in std :: hash ... – AntiClimacus

+0

@AntiClimacus 왜냐하면 나는 원래'std :: hash' 템플릿을 선언 한 사람이 아니기 때문입니다. –

+0

이것이 이유입니다. – AntiClimacus

답변

3

개인 내부 유형이므로 동봉 클래스에 개인/보호 std::unordered_map 회원이 있다고 가정합니다. 그런 경우라면 개인 내부 해시 펑터를 작성하여 std::unordered_map의 세 번째 인수로 전달하면됩니다. 귀하의 문제에 대한 가장 쉬운 해결책이라고 생각합니다.

+0

그래, 마침내이 일을 끝냈어. 가장 좋은 해결책은 아니 겠지. –

7

알 수 있습니다. 솔루션은 std :: hash를 전문으로하지 않고 사용자 고유의 Functor를 사용하는 것입니다. 이 게시물을 다스 려하여

struct A 
{ 
    A() { v.insert(std::make_pair(B(1), 6)); } 

private: 
    struct B 
    { 
    B(int i = 0) : m_i(i) { } 

    int m_i; 
    }; 

    struct HashB { std::size_t operator()(const B& b) const { return b.m_i; } }; 
    struct EqualB { bool operator()(const B&b1, const B&b2) const { return b1.m_i == b2.m_i; } }; 


    std::unordered_map<B, int, HashB, EqualB> v; 
};