0

I am trying to understand more the STL containers; Now I've read and used std::back_insert_iterator so I want to create a class like it for educational purpose only:

template <typename container>
class BackInsertIter {
    public:
        BackInsertIter() = delete;
        explicit BackInsertIter(container&);
        BackInsertIter& operator*();
        BackInsertIter& operator=( typename container::const_reference);

        container* container_;
};

template <typename container>
BackInsertIter<container>::BackInsertIter(container& cont) : 
    container_(&cont){

}

template <typename container>
BackInsertIter<container>& BackInsertIter<container>::operator*() {
    return *this;
}

template <typename container>
BackInsertIter<container>& BackInsertIter<container>::operator=(typename container::const_reference val) {
    container_->.push_back(val);
    return *this;
}

template <typename container>
BackInsertIter<container> Back_Insert(container& cont) {
    return BackInsertIter<container>(cont);
}


int main() {

    std::vector<int> vi;
    BackInsertIter< std::vector<int>> bivi(vi);

    *bivi = 57;
    *bivi = 10;
    *bivi = 24;
    *bivi = 81;


    for (auto i : vi)
        std::cout << i << ", ";
    std::cout << std::endl;

    std::list<std::string> lstr;
    BackInsertIter<std::list<std::string>> bilstr(lstr);

    *bilstr = "Hello to";
    *bilstr = "C++";
    *bilstr = "World!";

    for (const auto& str : lstr)
        std::cout << str << " ";
    std::cout << std::endl;

    vi.clear();

    auto it1 = Back_Insert(vi);
    *it1 = 1;
    *it1 = 2;
    *it1 = 3;
    *it1 = 4;
    *it1 = 5;

    for (auto i : vi)
        std::cout << i << ", ";
    std::cout << std::endl;

    auto it2 = Back_Insert(lstr);
    *it2 = "Ahmed";
    *it2 = "Programmer";

    for (const auto& str : lstr)
        std::cout << str << " ";
    std::cout << std::endl;

    vi.clear();

    std::cout << "enter integer values for vector folloed by endline character (ctrl+z): " << std::endl;
    std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(),
        Back_Insert(vi));

    for (const auto& i : vi)
        std::cout << i << " ";
    std::cout << std::endl;

}

The code works fine until I try to pass my Back_Insert_Iterator to std::copy where I get this error:

"Severity Code Description Project File Line Error C4996 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' ConsoleApplication1 c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility 2230 "

SergeyA
  • 61,605
  • 5
  • 78
  • 137
Itachi Uchiwa
  • 3,044
  • 12
  • 26

0 Answers0