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。
不幸的是,这是我第一次遇到这样的问题,我不知道该如何解决,有什么帮助吗?