BITCOIN100K
BITCOIN100K

Reputation: 11

Why does it say "Trying to reference a deleted function"?

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

Answers (1)

Caleth
Caleth

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

Related Questions