Я получаю странную ошибку C2535-компилятор при попытке скомпилировать следующий код:C2535 с шаблоном класса в unordered_map (Microsoft Visual Studio 2015 CTP6)
template<int NUMBER>
class Container {
public:
bool operator==(const Container& other) const { return true; }
};
namespace std {
template <int NUMBER>
class hash<Container<NUMBER>> {
public:
size_t operator()(const Container<NUMBER> & state) const {
return 0;
}
};
}
int main(int argc, char* argv[]){
auto* b = new std::unordered_map< Container<1>, int>(); //C2535
}
Обратите внимание, что если я использую мой собственный основанный на шаблонах Хашер
template<int NUMBER>
class Hash {
public:
size_t operator()(const Container<NUMBER> & state) const {
return 0;
}
};
int main(int argc, char* argv[]){
auto* b = new std::unordered_map< Container<1>, int, Hash<1>>();
}
код компилируется просто отлично. И я помню, что код компилировался без сбоев в Visual Studio 2013 Express.
Вопрос: Это VS 2015 - ошибка или это поведение в некотором роде стандартно-совместимо?
std :: hash не является классом. Это структура. См. Live http://rextester.com/VHHQE6270 – grisha
@ user2451677: Насколько я знаю, struct - это просто класс, при котором доступ по умолчанию является открытым, а не частным. Во всяком случае, с помощью шаблона ** struct ** Hash был отлично скомпилирован! – Mischa
@ user2451677 Хорошая точка. Я думал, что это объявлено «класс хэш». – Columbo