struct MapInserter
{
private:
int count;
public:
explicit MapInserter()
: count(0)
{
}
std::pair<int, std::string> operator()(std::string& value)
{
return std::make_pair(count++, value);
}
};
vector<std::string> words = { "one", "two", "three","four","five" };
std::map<int, std::string> map;
MapInserter inserter;
transform(words.begin(), words.end(), map.begin(), inserter);
for (auto it = map.begin(), end = map.end(); it != end; ++it)
cout << it->first << " : " << it->second << endl;
return 0;
это код. VS возвращает ошибку компиляции в отношении l-value specifies const object
.l-value указывает объект const при использовании std :: make_pair
Щелчок по ошибке перемещает вас на следующий код в файл с именем утилита
template<class _Other1,
class _Other2>
_Myt& operator=(pair<_Other1, _Other2>&& _Right)
{ // assign from moved compatible pair
first = _STD forward<_Other1>(_Right.first);
second = _STD forward<_Other2>(_Right.second);
return (*this);
}
на первом, я имел operator()
взять const std::string&
так что я удалил Конст, потому что это, очевидно, идет о функции make_pair , Но это все еще не исчезло. Может ли кто-нибудь указать мне на эту ошибку?
Почему вы берете 'значение' ссылкой на lvalue? Просто возьмите по значению и переместите или возьмите по ссылке на 'const'. Я просто быстро просмотрел код, но думаю, что это может решить проблему. –
Я не уверен, как выразить это формально, но я подозреваю, что это зависает на 'count ++', и было бы лучше, если бы вы перенесли инкремент из вызова в std :: make_pair(). – Logicrat
'std :: pair operator() (std :: string value) {return std :: make_pair (count ++, value); } 'все еще давая ошибку –