Должен ли я полностью построить объект Unomoromed_set :: Key_type, чтобы вызвать метод eShase ()?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Должен ли я полностью построить объект Unomoromed_set :: Key_type, чтобы вызвать метод eShase ()?

Сообщение Anonymous »

Я задал аналогичный вопрос для find () метод std :: unoromeded_set последний день - как я могу использовать легкий аргумент в методе unoromeded_set :: find ()?. Но рекомендации, полученные для метода find () , не работает для метода eRase () .
#include
#include
#include
#include
#include

struct Storage
{
struct Hash
{
std::size_t operator()(const Storage& storage) const noexcept
{
return std::hash{}(storage.key);
}
std::size_t operator()(const std::string& key) const noexcept
{
return std::hash{}(key);
}
using is_transparent = std::true_type;
};

std::string key;
// One more fat fields...
};

inline bool
operator==(const Storage& lhs, const Storage& rhs) noexcept
{
return lhs.key == rhs.key;
}

inline bool
operator==(const Storage& lhs, const std::string& rhs) noexcept
{
return lhs.key == rhs;
}

inline bool
operator==(const std::string& lhs, const Storage& rhs) noexcept
{
return lhs == rhs.key;
}

int
main()
{
auto uset = std::unordered_set
{
{ .key="42" }
};

// It's compiled here
auto it = uset.find("42");
if (it != uset.end())
std::println("{}", it->key);

// But doesn't compile here :(
uset.erase("42");
}

cppreference указывает, что присутствует следующая перегрузка:
template< class K >
size_type erase( K&& x );

Я нашел его здесь - https://en.cppreference.com/w/cpp/conta ... erase.html. Но G ++ сказал мне: < /p>
main.cc: In function ‘int main()’:
main.cc:58:13: error: no matching function for call to ‘std::unordered_set::erase(const char [3])’
58 | uset.erase("42");
| ~~~~~~~~~~^~~~~~
main.cc:58:13: note: there are 4 candidates
In file included from /usr/include/c++/15.1.1/unordered_set:43,
from main.cc:5:
/usr/include/c++/15.1.1/bits/unordered_set.h:594:7: note: candidate 1: ‘std::unordered_set::iterator std::unordered_set::erase(const_iterator) [with _Value = Storage; _Hash = Storage::Hash; _Pred = std::equal_to; _Alloc = std::allocator; iterator = std::_Hashtable::iterator; const_iterator = std::_Hashtable::const_iterator]’
594 | erase(const_iterator __position)
| ^~~~~
/usr/include/c++/15.1.1/bits/unordered_set.h:594:28: note: no known conversion for argument 1 from ‘const char [3]’ to ‘std::unordered_set::const_iterator’ {aka ‘std::_Hashtable::const_iterator’}
594 | erase(const_iterator __position)
| ~~~~~~~~~~~~~~~^~~~~~~~~~
/usr/include/c++/15.1.1/bits/unordered_set.h:599:7: note: candidate 2: ‘std::unordered_set::iterator std::unordered_set::erase(iterator) [with _Value = Storage; _Hash = Storage::Hash; _Pred = std::equal_to; _Alloc = std::allocator; iterator = std::_Hashtable::iterator]’
599 | erase(iterator __position)
| ^~~~~
/usr/include/c++/15.1.1/bits/unordered_set.h:599:22: note: no known conversion for argument 1 from ‘const char [3]’ to ‘std::unordered_set::iterator’ {aka ‘std::_Hashtable::iterator’}
599 | erase(iterator __position)
| ~~~~~~~~~^~~~~~~~~~
/usr/include/c++/15.1.1/bits/unordered_set.h:616:7: note: candidate 3: ‘std::unordered_set::size_type std::unordered_set::erase(const key_type&) [with _Value = Storage; _Hash = Storage::Hash; _Pred = std::equal_to; _Alloc = std::allocator; size_type = long unsigned int; key_type = Storage]’
616 | erase(const key_type& __x)
| ^~~~~
/usr/include/c++/15.1.1/bits/unordered_set.h:616:29: note: no known conversion for argument 1 from ‘const char [3]’ to ‘const std::unordered_set::key_type&’ {aka ‘const Storage&’}
616 | erase(const key_type& __x)
| ~~~~~~~~~~~~~~~~^~~
/usr/include/c++/15.1.1/bits/unordered_set.h:634:7: note: candidate 4: ‘std::unordered_set::iterator std::unordered_set::erase(const_iterator, const_iterator) [with _Value = Storage; _Hash = Storage::Hash; _Pred = std::equal_to; _Alloc = std::allocator; iterator = std::_Hashtable::iterator; const_iterator = std::_Hashtable::const_iterator]’
634 | erase(const_iterator __first, const_iterator __last)
| ^~~~~
/usr/include/c++/15.1.1/bits/unordered_set.h:634:7: note: candidate expects 2 arguments, 1 provided


Подробнее здесь: https://stackoverflow.com/questions/797 ... ase-method
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»