>

std :: hash operator ()를 오버로드하는 여러 클래스가 있습니다. 의 말을하자:

class A
{
...
}
namespace std
{
  template<typename T>
  struct hash;
}
A.cpp
template<> struct std::hash<A>
{
  public:
  virtual std::size_t operator()(const A& joint) const noexcept
  {
..
}

비슷한 수업을 해봅시다 class Bclass C

지금 class B 다음과 같이 A의 해시를 사용합니다.

boost::hash_combine(h, std::hash<A>{}(b.getA())

문제: error: use of deleted function std::hash<A>::hash()

나는 시도했다 : 아

namespace std
{
  template<typename T>
  struct hash;
}

B.h

class B 
{
   friend struct std::hash<A>;
}

  • 답변 # 1

    당신은 정의해야 std::hash<A> 전문화 A.h 그래서 BC 전문화가 존재하고 그것을 가지고 있음을 볼 수있을 것입니다 operator() 회원.

    만약 BC "볼"수 없습니다 std::hash<A> 전문화하면 기본 인스턴스를 인스턴스화합니다. std::hash 표준 라이브러리가 사용자 정의 유형을 해시하는 방법을 모르기 때문에 비활성화 된 템플릿 A .

    당신이 선언하면 std::hash<A> 전문화 A.h 하지만 정의하지 않으면 BC 불완전한 클래스로 볼 수 있습니다. operator() 호출 할 수 없습니다.

    따라서 정의해야합니다 std::hash<A>A.h . 다음과 같이 할 수 있습니다 :

    // A.h
    namespace std {
    template <> struct hash<A> {
        std::size_t operator()(const A&) const noexcept { ... }
    };
    }
    
    

    당신은 또한 정의를 이동할 수 있습니다 operator() ~로 A.cpp 파일:

    // A.h
    namespace std {
    template <> struct hash<A> {
        std::size_t operator()(const A&) const noexcept;
    };
    }
    // A.cpp
    namespace std {
    std::size_t hash<A>::operator()(const A&) const noexcept { ... }
    }
    
    

  • 이전 javascript - React에서 내 게시물의 댓글을 업데이트하는 방법
  • 다음 emacs - 람다 내 defun에서 매개 변수를 사용할 때 '변수의 변수 값이 void - '