Недопустимая ошибка класса хранилища, вызванная явным ключевым словом - PullRequest
0 голосов
/ 19 октября 2019

Я использую 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);
    }
};
...