I have created a sample program, I am able build on windows but on linux getting below error
Code:
TEST.HPP
#include<iostream>
#include <iterator>
#include <vector>
typedef int Int;
using namespace std;
template<class C, typename T>
class poly_iterator : public iterator_traits<typename C::iterator>
{
private:
// typedef poly_iterator<C,T> _Self;
protected:
typedef typename C::iterator I;
//!< regular iterator of the underlying container
I i;
//! mimic inheritage from the regular iterator
//! because we cannot simply derive from it since
// some iterators are regular pointers
public:
operator I&()
{
return (I&)i;
}
//!<needed to use poly_iterator in algorithms transparently
public:
poly_iterator<C,T>() {};
poly_iterator<C,T>(const I& p):i(p) {};
//!< construction form const_poly_iterator
T& operator*() {return (T&)*i;}
T* operator->() {return (T*)&*i;}
public: // compatibility with I iterator
poly_iterator<C,T>& operator++() {++i; return *this;}
poly_iterator<C,T>& operator--() {--i; return *this;}
poly_iterator<C,T> operator+(const Int count)
{
I temp = i;
temp += count;
return poly_iterator<C,T>(temp);
}
poly_iterator<C,T> operator-(const Int count)
{
I temp = i;
temp -= count;
return poly_iterator<C,T>(temp);
}
poly_iterator<C,T>& operator++(Int)
{
i++;
return *this;
}
poly_iterator<C,T>& operator--(Int)
{
i--;
return *this;
}
bool operator<(const poly_iterator<C,T>& other) const
{
return i < other.i;
}
bool operator<(const I& other) const
{
return i < other;
}
bool operator<=(const poly_iterator<C,T>& other) const
{
return i <= other.i;
}
bool operator<=(const I& other) const
{
return i <= other;
}
bool operator>(const poly_iterator<C,T>& other) const
{
return i > other.i;
}
bool operator>(const I& other) const
{
return i > other;
}
bool operator>=(const poly_iterator<C,T>& other) const
{
return i >= other.i;
}
bool operator>=(const I& other) const
{
return i >= other;
}
bool operator==(const I& other) const
{
return i==other;
}
bool operator!=(const I& other) const
{
return i!=other;
}
bool operator==(const poly_iterator<C,T>& other) const
{
return i==other.i;
}
bool operator!=(const poly_iterator<C,T>& other) const
{
return i!=other.i;
}
};
TEST.CPP
//#include "stdafx.h"
// iterator_traits.cpp
// compile with: /EHsc
#include <iostream>
#include <iterator>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
#include "test.hpp"
int main()
{
vector<int> v(10);
v[4] = 42;
poly_iterator<vector<int>, int> it;
poly_iterator<vector<int>, int> first(v.begin());
poly_iterator<vector<int>, int> last(v.end());
it = find(first, last, 42);
if (it != last) {
cout << *it << '\n';
}
return 0;
}
error:
epuser@VOPTENG01 ~/Consolidator/vaibhav $> g++ test.cpp -o test.exe
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function â_RandomAccessIterator std::__find(_RandomAccessIterator, _RandomAccessIterator, const _Tp&, std::random_access_iterator_tag) [with _RandomAccessIterator = poly_iterator<std::vector<int, std::allocator<int> >, int>, _Tp = int]â:
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:316: instantiated from â_InputIterator std::find(_InputIterator, _InputIterator, const _Tp&) [with _InputIterator = poly_iterator<std::vector<int, std::allocator<int> >, int>, _Tp = int]â
test.cpp:20: instantiated from here
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:204: error: no match for âoperator-â in â__last - __firstâ
test.hpp:50: note: candidates are: poly_iterator<C, T> poly_iterator<C, T>erator-(Int) [with C = std::vector<int, std::allocator<int> >, T = int]
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:182: note: ptrdiff_t stderator-(const std::_Bit_iterator_base&, const std::_Bit_iterator_base&)
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:316: instantiated from â_InputIterator std::find(_InputIterator, _InputIterator, const _Tp&) [with _InputIterator = poly_iterator<std::vector<int, std::allocator<int> >, int>, _Tp = int]â
test.cpp:20: instantiated from here
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:225: error: no match for âoperator-â in â__last - __firstâ
test.hpp:50: note: candidates are: poly_iterator<C, T> poly_iterator<C, T>erator-(Int) [with C = std::vector<int, std::allocator<int> >, T = int]
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:182: note: ptrdiff_t stderator-(const std::_Bit_iterator_base&, const std::_Bit_iterator_base&)