unordered_map<std::pair<enum_class,other_enum_class>,std::uint8_t>
一部のピクセルマップ形式を管理 するために を使用したいと考えています。
ここに最小限のコード:
#include <unordered_map>
#include <utility>
#include <cstdint>
#include <iostream>
#include <functional>
enum class PNM : std::uint8_t { PBM, PGM, PPM };
enum class Format : bool { BIN, ASCII };
struct pair_hash {
public:
template <typename T, typename U>
std::size_t operator()(const std::pair<T, U> &x) const {
return std::hash<T>()(x.first) ^ std::hash<U>()(x.second);
}
};
int main(){
std::unordered_map<std::pair<PNM, Format>, std::uint8_t, pair_hash> k_magic_number ({
{ { PNM::PBM, Format::BIN }, 1 }, { { PNM::PGM, Format::BIN }, 2 }, { { PNM::PPM, Format::BIN }, 3 },
{ { PNM::PBM, Format::ASCII }, 4 }, { { PNM::PGM, Format::ASCII }, 5 }, { { PNM::PPM, Format::ASCII }, 6 }
});
std::cout << k_magic_number[std::make_pair<PNM, Format>(PNM::PBM, Format::BIN)];
}
GCC では、クラスをインスタンス化しようとするとエラーが発生します。
main.cpp:14:24: エラー: 不完全な型 'struct std::hash' の無効な使用
return std::hash()(x.first) ^ std::hash()(x.second); /usr/local/include/c++/5.2.0/bits/basic_string.h:5469:0
からインクルードされたファイルでは、 /usr/local/include/c++/5.2.0/ string:52 から [...]
Clang では、エラーもあります。
エラー: 未定義のテンプレート 'std::hash' の暗黙的なインスタンス化 return std::hash()(x.first) ^ std::hash()(x.second); /usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/bits/hashtable_policy. h:1257:16: 注: 関数テンプレートの特殊化 'pair_hash::operator()' のインスタンス化では、ここで [...]
VS2013 ではエラーは発生せず、コードはコンパイルおよび実行されます。
私のコードには何が欠けていますか?