错误C2280尝试引用已删除的功能

时间:2020-06-29 15:45:08

标签: c++

Error C2280 'std::_Uhash_compare<_Kty,_Hasher,_Keyeq>::_Uhash_compare(const std::_Uhash_compare<_Kty,_Hasher,_Keyeq> &) attempting to reference a deleted function出现错误,我不知道问题的根源,但是当单击错误消息时,它会将我重定向到unordered_map文件,但是我尽力了结我的代码的哪一部分是导致问题的原因,我发现此方法是名为DirWin32的类的一部分:

az::List<az::String, az::String> DirWin32::GetContents() {
    WIN32_FIND_DATA dirData;
    HANDLE hDir;
    az::coString path = m_dirPath + T("\\*");
    az::List<az::String, az::String> dirContent;
    hDir = FindFirstFile(path.c_str(), &dirData);
    if (hDir == INVALID_HANDLE_VALUE) {
        return az::List<az::String, az::String>();
    }
    while (FindNextFile(hDir, &dirData)) {
        if (dirData.cFileName == T(".") || dirData.cFileName == T("..")) continue;
        if (dirData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
            dirContent.Add(dirData.cFileName, T("directory"));
        } else {
            dirContent.Add(dirData.cFileName, T("file"));
        }
    }
    FindClose(hDir);
    return dirContent;
}

此行az::List<az::String, az::String> dirContent;是导致问题的原因,更准确地说,<az::String, az::String>是导致问题的实际原因。 az::String是一个自定义类,用于处理UTF-16字符串。
之前我已经读过,如果该类中没有复制/移动构造函数,则编译器会将其设为已删除的方法,因此,我已经像az::String这样向String(const String&) = default;编写了一个默认的复制构造函数,但是问题是仍然存在。

az::String类:

typedef const wchar_t* constcString;
typedef wchar_t* cstring;
typedef std::wstring coString;

class String {
public:
    /**
     * The default Constructor.
     */
    String();
    /**
     * The copy constructor.
     *
     * @param StringObject A az::String object.
     */
    az::String::String(const String& azStringObject);
    /**
     * The constructor with "az::chart" C-string array.
     *
     * @param str A az::chart C-string array.
     */
    String(az::constcString str);
    /**
     * The constructor with "az::ostringt" C++ string object.
     *
     * @param str A az::ostringt c++ string object.
     */
    String(az::coString str);
    ~String();
    void operator=(az::constcString str);
    az::String& operator=(const String& StringObject);
private:
    coString m_string;
    size_t m_length;
};


az::String::String() {
    m_length = 0;
    m_string = { 0 };
}

az::String::String(const String& azStringObject) {
    m_length = azStringObject.m_length;
    m_string = azStringObject.m_string;
}

az::String::String(az::constcString str) {
    m_length = std::char_traits<az::cChar>::length(str);
    m_string = str;
}


az::String::String(az::coString str) {
    m_length = str.length();
    m_string = str.c_str();
}

az::String::~String() {
    //m_string = { 0 };
}


void az::String::operator=(az::constcString str) {
    m_string = str;
    m_length = m_string.length();
}

az::String& az::String::operator=(const String& StringObject) {
    m_string = StringObject.m_string;
    m_length = StringObject.m_length;
    return *this;
}

az::List类:

#include <unordered_map>

template <typename KeyType, typename ValueType>
    class List {
    private:
        // The main container
        std::unordered_map<KeyType, ValueType> m_container;
        // The list iterator
        typedef typename std::unordered_map<KeyType, ValueType>::const_iterator ListIterator;
    public:
        /**
         * The default Constructor
         */
        List() = default;
        /**
         * The constructor with initializer list
         */
        List(std::initializer_list<std::pair<KeyType, ValueType>> items);
        ~List() = default;
        /**
         * Set/Get an item in the list
         *
         * @param key The item's key.
         * @return A reference to the item.
         */
        ValueType& operator[](KeyType key);
        /**
         *  Get an iterator to the beginning of the list
         *
         * @return an iterator to the beginning of the list.
         */
        typename std::unordered_map<KeyType, ValueType>::const_iterator Beginning();
        /**
         *  Get an iterator to the end of the list
         *
         * @return an iterator to the end of the list.
         */
        typename std::unordered_map<KeyType, ValueType>::const_iterator End();
    };
}

/**
 * The Constructor
 */
template<typename KeyType, typename ValueType>
az::List<KeyType, ValueType>::List(std::initializer_list<std::pair<KeyType, ValueType>> items) : m_container(items.begin(), items.end()) {}

/**
 * Set/Get an item in the list
 *
 * @param key The item's key.
 * @return A reference to the item.
 */
template<typename KeyType, typename ValueType>
ValueType & az::List<KeyType, ValueType>::operator[](KeyType key) {
    return m_container[key];
}

/**
 *  Get an iterator to the beginning of the list
 *
 * @return an iterator to the beginning of the list.
 */
template<typename KeyType, typename ValueType>
typename std::unordered_map<KeyType, ValueType>::const_iterator az::List<KeyType, ValueType>::Beginning() {
    return m_container.cbegin();
}

/**
 *  Get an iterator to the end of the list
 *
 * @return an iterator to the end of the list.
 */
template<typename KeyType, typename ValueType>
typename std::unordered_map<KeyType, ValueType>::const_iterator az::List<KeyType, ValueType>::End() {
    return m_container.cend();
}

我正在使用VS2019。

不幸的是,这是我第一次遇到这样的问题,我不知道该如何解决,有什么帮助吗?

0 个答案:

没有答案