Piszę własną klasę kontenerów i napotkałem problem, którego nie mogę zrozumieć. Oto próbka bare-bone, która pokazuje problem.Problem iteratora i const_iteratora C++ dla własnej klasy kontenera
Składa się z klasy kontenera i dwóch klas testowych: jednej klasy testowej używającej std: wektor, który ładnie kompiluje i drugiej klasy testowej, która stara się używać mojej własnej klasy kontenerów w dokładnie taki sam sposób, ale nie udaje się skompromitować.
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
template <typename T>
class MyContainer
{
public:
class iterator
{
public:
typedef iterator self_type;
inline iterator() { }
};
class const_iterator
{
public:
typedef const_iterator self_type;
inline const_iterator() { }
};
iterator begin() {
return iterator();
}
const_iterator begin() const {
return const_iterator();
}
};
// This one compiles ok, using std::vector
class TestClassVector
{
public:
void test() {
vector<int>::const_iterator I=myc.begin();
}
private:
vector<int> myc;
};
// this one fails to compile. Why?
class TestClassMyContainer
{
public:
void test(){
MyContainer<int>::const_iterator I=myc.begin();
}
private:
MyContainer<int> myc;
};
int main(int argc, char ** argv)
{
return 0;
}
gcc mówi mi:
test2.C: In member function ‘void TestClassMyContainer::test()’:
test2.C:51: error: conversion from ‘MyContainer::iterator’ to non-scalar type ‘MyContainer::const_iterator’ requested
nie jestem pewien, gdzie i dlaczego kompilator chce przekształcić iterator do const_iterator dla własnej klasy, ale nie dla klasy STL wektora. Co ja robię źle?
Wielkie dzięki. Teraz wystarczy sprawdzić, czy deklaruję const_iterator jako przyjaciela iteratora ... lub piszę funkcje akcesor do prywatnych iteratorów, ale to powinno być wykonalne. – BaCh