2011-01-23 4 views
0

나는 게이트웨이 클래스를 가지고 있습니다. 이 클래스의 객체를 해시 테이블에 저장해야합니다 (tr1 :: unordered_set 사용). 다른 문맥에서 unorderd_set과 class Gateway를 모두 사용했지만 잘 작동하지만 tr1의 네임 스페이스에서 hash 함수를 정의 할 수 없기 때문에 정렬되지 않은 집합에 게이트웨이를 두는 방법을 생각할 수 없습니다.템플릿 클래스의 tr1에서 해시를 정의합니다.

namespace std { 
    namespace tr1 { 
     template<> <typename T> inline size_t hash<(typename Gateway<T>)>::operator()(Gateway<T> gT) const { 
      return gT.getCore()->hash(); //!DOESN't WORK 
    } 
} 

는 컴파일러는이 (typename Gateway<T>가) 잘못 말했다 (그리고 다른 많은 변종) :

나는 시도했습니다. 내가 ()을 꺼내면 hash<typename Gateway<T>>()의 끝에있는 >>이 출력 스트림이라고 가정합니다.

과거에 내가이

namespace std { 
    namespace tr1 { 
     template<> inline size_t hash<Board>::operator()(Board b) const { 
      return b.hash();   //!WORKS FINE 
     } 
    } 
} 

사람이 문제에 도움이 되거 수 한 적이 있지만? 답에 대한

업데이트

덕분에 아직은 컴파일러는 불완전한 유형의 잘못된 사용 struct std::tr1::hash<> 우리가 완전한 정의하지 않고 클래스를 사용할 때 오류 이런 종류의 일이

, 아직라는 문제가있다 클래스는 선언 전에 완전히 정의됩니다. 나는 이미 템플릿없이 아주 비슷한 방식으로 문제없이 이것을 사용했다.

+0

'hash >()'> 문자 사이에 공백이 필요합니다. C++ 0x가 수정되었습니다. – KitsuneYMG

+0

http://en.cppreference.com/w/cpp/utility/hash에 나와있는 예제에 따라 비슷한 문제가 발생했습니다.) –

답변

2
template <typename T> 
inline size_t hash<(typename Gateway<T>)>::operator()(Gateway<T> gT) const 

잘못된 구문입니다. typename은 필요하지 않습니다.

올바른 구문은 이것이다 :

namespace tr1 
{ 
    template <typename T> 
    inline size_t hash<Gateway<T> >::operator()(const Gateway<T> & gT) const 
    { 
      return gT.getCore()->hash();   
    } 
} 

공지 사항 나는 또한 단지 사본을 방지하기 위해, 매개 변수 const Gateway<T> & 유형을했다!

네임 스페이스 tr1은 중첩 된 네임 스페이스가 아닙니다.

관련 문제