2012-12-20 2 views
0

GCC에서 다음과 같은 오류 코드에 대한 간단한 검색을 수행하는 데, 히트 수는 질문에이 문제에 대한 도움을 요청 보여 주지만, 아무것도 많은 콘크리트가집니다 :템플릿 전문화 C++ 98

error: explicit specialization of non-template 'std::hash'

std :: hash가 실제로 템플릿이기 때문에 문제가 무엇인지 명확하지 않습니다. 메시지를 생성하는 샘플 코드는 다음과 같습니다. GCC 옵션 -std = C++ 0x는 코드를 잘 컴파일합니다. 문제는 내가 하나의 컴퓨터에서 C++ 11을 지원하지 않는 구형 컴파일러를 가지고 있기 때문에 이것이 컴파일되지 않는 이유에 대한 약간의 설명이 유용 할 것입니다.

대안은 전문화 대신 상속을 사용하는 것일 수도 있으며, 이것이 유일한 해결책 인 경우 알고있는 것도 좋습니다.

#include <functional> 

struct test 
{ 
    int n; 
}; 

namespace std 
{ 
    template<> 
     struct hash<test> 
     { 
     }; 
} 
+1

무슨 "오래된 컴파일러"에 대해 이야기하고 있습니까? GCC의 이전 버전입니까? 아니면 완전히 다른 컴파일러인가? – AnT

+0

당신의 질문은 기본적으로 "C++ 11을 사용할 때, C++ 11을 사용할 수 없을 때, 왜 작동하지 않습니까?" ... 대답은 분명해야합니다 –

답변

5

문제는 std::hash이며이를 사용하는 정렬되지 않은 컨테이너는 C++ 11 이전에는 존재하지 않았습니다. C++ 98만을 이해하는 컴파일러를 사용해야하는 경우에는 사용할 수 없습니다.

유사한 컨테이너는 TR1 및 부스트에서 사용할 수 있습니다.

2

std::hash은 C++ 11에서만 도입되었습니다. 따라서 std에는 C++ 98/C++ 03을 전문으로하는 template <typename T> struct hash { ... };이 없습니다.

5

나중에 GCC의 프리 -C++ 11 버전에서 비표준 레거시 hash_sethash_map 구현은 이 아니라 std이 아닌 네임 스페이스에 배치되었습니다. 따라서 해당 레거시 컨테이너 집합에 대한 기본 해싱 함수는 실제로 __gnu_cxx::hash<T>이 아니라 std::hash<T>이 아닙니다. 또한 AFAIK는 <functional>의 일부가 아닙니다.

다음 사전 표준 unordered_setunordered_map의 새로운 구현 hash functior의 자신의 버전이 실제로 std::tr1::hash<T>하지 std::hash<T> 것을 의미 std::tr1 네임 스페이스에 거주했다.

이전 컴파일러를 사용하는 경우 필요에 따라 선택하십시오.

그래서 나는 당신의 std 그냥 <functional> 당신이 템플릿 컨텍스트에서 사용하려고 할 때 불평하는 컴파일러의 원인이되는 몇 가지 전혀 관계가없는 비 템플릿 이름 hash를 선언하는 일 것으로 추측에는 요.

+0

''에 관련이없는'hash '이름이 없으면 G ++에서 선언되지 않은 이름에 대해 오류를 제공합니다. –