У меня есть vector
:
std::vector<island> sea;
И теперь я хочу хранить указатели на все элементы этого vector
в другом vector
. Но просто для личного упражнения я хочу сделать это в причудливом стиле C++, поэтому вместо std::vector<const island*> p_sea
я набираю:
std::vector<std::reference_wrapper<const island>> r_sea;
И теперь я хотел бы заполнить этот новый vector
ссылками:
std::transform(sea.begin(), sea.end(),
std::back_inserter(r_sea),
std::cref<island>
);
Насколько я понимаю, из статей cppreference четвертый аргумент transform
должен быть функцией, которая принимает константные ссылки на элементы из исходного диапазона и возвращает элементы целевого диапазона; именно это и делает std::cref<island>
: принимает const island&
в качестве аргументов и возвращает std::reference_wrapper<const island>
. Так что я считаю, что это должно работать ??
Однако это не так:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>
struct island {
long long x,y; //coords
};
int main() {
std::vector<island> sea;
std::vector<std::reference_wrapper<const island>> r_sea;
std::transform(sea.begin(), sea.end(),
std::back_inserter(r_sea),
std::cref<island>
);
return 0;
}
Это приводит к следующим ошибкам компиляции:
prog.cpp: In function ‘int main()’:
prog.cpp:19:5: error: no matching function for call to ‘transform(std::vector<island>::iterator, std::vector<island>::iterator, std::back_insert_iterator<std::vector<std::reference_wrapper<const island> > >, <unresolved overloaded function type>)’
);
^
In file included from /usr/include/c++/6/algorithm:62:0,
from prog.cpp:3:
/usr/include/c++/6/bits/stl_algo.h:4166:5: note: candidate: template<class _IIter, class _OIter, class _UnaryOperation> _OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation)
transform(_InputIterator __first, _InputIterator __last,
^~~~~~~~~
/usr/include/c++/6/bits/stl_algo.h:4166:5: note: template argument deduction/substitution failed:
prog.cpp:19:5: note: could not resolve address from overloaded function ‘cref<island>’
);
^
In file included from /usr/include/c++/6/algorithm:62:0,
from prog.cpp:3:
/usr/include/c++/6/bits/stl_algo.h:4203:5: note: candidate: template<class _IIter1, class _IIter2, class _OIter, class _BinaryOperation> _OIter std::transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation)
transform(_InputIterator1 __first1, _InputIterator1 __last1,
^~~~~~~~~
/usr/include/c++/6/bits/stl_algo.h:4203:5: note: template argument deduction/substitution failed:
prog.cpp:19:5: note: could not resolve address from overloaded function ‘cref<island>’
);
Что я делаю не так?
... Я вернулся к злым указателям C.
std::reference_wrapper<const island>
вместоstd::reference_wrapper<const island*>
. - person cdhowie   schedule 11.12.2017std::cref
перегружен. Вам нужно устранить неоднозначность, какую перегрузку использовать. - person StoryTeller - Unslander Monica   schedule 11.12.2017