Reputation: 11
I'm trying to customize an iterator, however, inserting an element from VECTOR into set on the last line prompts "Trying to reference a deleted function"? Why is this?I think it might be an inline function, but I don't know what to do.
#include <iostream>
#include <vector>
#include <unordered_set>
#include <algorithm>
template <typename Container>
class asso_insert_iterator : public std::iterator<std::output_iterator_tag, typename Container::value_type> {
protected:
Container& container;
public:
explicit asso_insert_iterator(Container& c) : container(c){};
asso_insert_iterator<Container>& operator=(const typename Container::value_type& value)
{
container.insert(value);
return *this;
}
asso_insert_iterator<Container>& operator*()
{
return *this;
}
asso_insert_iterator<Container>& operator++()
{
return *this;
}
asso_insert_iterator<Container>& operator++(int)
{
return *this;
}
};
template <typename Container>
inline asso_insert_iterator<Container> asso_inserter(Container& c)
{
return asso_insert_iterator<Container>(c);
}
int main()
{
std::unordered_set<int> coll;
asso_insert_iterator<decltype(coll)> iter(coll);
*iter = 1;
iter++;
*iter = 2;
std::copy(coll.begin(), coll.end(), std::ostream_iterator<int>(std::cout, " "));
std::vector<int> val = { 33, 67, -4, 13, 5, 2 };
std::copy(val.begin(), val.end(), asso_inserter(coll));
}
Upvotes: 1
Views: 126
Reputation: 63152
The issue is that asso_insert_iterator
is not an Iterator, because it is not CopyAssignable.
The simplest fix is to have a pointer member rather than a reference member.
template <typename Container>
class asso_insert_iterator : public std::iterator<std::output_iterator_tag, typename Container::value_type> {
protected:
Container* container;
public:
explicit asso_insert_iterator(Container& c) : container(std::addressof(c)){};
asso_insert_iterator<Container>& operator=(const typename Container::value_type& value)
{
container->insert(value);
return *this;
}
asso_insert_iterator<Container>& operator*()
{
return *this;
}
asso_insert_iterator<Container>& operator++()
{
return *this;
}
asso_insert_iterator<Container>& operator++(int)
{
return *this;
}
};
Upvotes: 1