Я пишу собственный контейнерный класс и столкнулся с проблемой, с которой я не могу разглядеть. Здесь показан образец пустой кости, который показывает проблему.
Он состоит из класса контейнера и двух тестовых классов: один тестовый класс с использованием std: vector, который компилируется красиво, и второй тестовый класс, который пытается использовать мой собственный класс контейнера точно таким же образом, но с трудом скомпилируется.
#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 говорит мне:
test2.C: В функции-члена 'void TestClassMyContainer:: test():
test2.C: 51: ошибка: преобразование из 'MyContainer:: iterator в нескалярный тип' MyContainer:: const_iterator запрошен
Я не уверен, где и почему компилятор хочет преобразовать итератор в const_iterator для моего собственного класса, но не для векторного класса STL. Что я делаю не так?