Я использую vs2019. Я хотел использовать класс шаблона unordered_multimap, поддерживаемый C ++ 11, потому что мой класс не поддерживал упорядоченный оператор (такой как <<= ...). Мой класс не поддерживается в unordered_multimap для вычисления хеша. Ошибка была расположена в: <code>ldiv_t _Qrem = _CSTD ldiv((long)(size_t)_Keyval, 127773);, поэтому я решил написать преобразование типа в size_t.
explicit operator size_t() const;
MiniSet<T>::operator size_t() const
{
auto iter = _set.begin();
size_t ret = 0;
while (iter != _set.end())
{
ret += (size_t)(*(T*)*iter);
ret *= 10;
iter++;
}
return ret;
}
Смущающая ошибка: C2017: недопустимый класс хранилища. Ошибка, указанная в MSN класса хранения, в котором указана только автоматическая регистрация статического extern typedef __declspec, но не явная. size_t может быть разновидностью typedef, но при замене int-преобразования произошла идентичная ошибка.
#include <list>
#include<cstdlib>
template <class T> class MiniSet
{
friend class SetIterator<T>;
public:
MiniSet(){};
MiniSet(const T);
int Size() const;
void add(const T);
void del(const T);
bool isempty();
void clrc();
MiniSet(const MiniSet&);
MiniSet& operator=( const MiniSet&);
MiniSet& operator^=(const MiniSet&);
MiniSet& operator+=(const MiniSet&);
MiniSet& operator-=(const MiniSet&);
MiniSet& operator&=(const MiniSet&);
explicit operator size_t() const;
private:
std::list<void*>_set;
size_t signature;
}
template<class T>
MiniSet<T>::operator size_t() const
{
auto iter = _set.begin();
size_t ret = 0;
while (iter != _set.end())
{
ret += (size_t)(*(T*)*iter);
ret *= 10;
}
return ret;
}
template<class T> class MiniSet;
template<class T> class MiniSetHash;
template<class T>
class MiniSetHash
{
friend MiniSet<T>;
size_t operator()(const MiniSet<T>& item) const
{
std::vector<bool> to_hash;
auto iter = item._set.begin();
while (iter != item._set.end())
{
T val = *(T*)(*iter);
to_hash.push_back(val);
iter++;
}
return std::hash<std::vector<bool>>(to_hash);
}
};