У меня есть несколько классов, которые реализуют геометрические объекты на основе вершин, такие как TriangleMesh, PointClouds или Edgesets.Все они наследуются от VertexBasedGeometry.Теперь я хочу, чтобы все они возвращали двунаправленный итератор по ссылкам его вершин.Это позволило бы получить доступ к вершинам любой VertexBasedGeometry не по шаблону.Теперь, когда я не очень хорошо знаком с итераторами, это оказывается довольно сложно.Моя попытка выглядит следующим образом:
class VertexBasedGeometry : public Geometry
{
public:
typedef std::iterator<std::bidirectional_iterator_tag,defines::Vector3 > VertexIterator;
VertexBasedGeometry(){};
virtual VertexIterator begin()=0;
virtual VertexIterator end()=0;
};
В TraingleMesh, которая наследуется от VertexBasedGeometry, я сейчас пытаюсь реализовать функцию begin, возвращая итератор начала std :: vector, который содержит его вершины.Это приводит к следующей ошибке компилятора на gcc 4.2 (apple):
Mesh.cpp:25: error: conversion from '__gnu_cxx::__normal_iterator<defines::Vector<double, 3>*, std::vector<defines::Vector<double, 3>, std::allocator<defines::Vector<double, 3> > > >' to non-scalar type 'std::iterator<std::bidirectional_iterator_tag, defines::Vector<double, 3>, long int, defines::Vector<double, 3>*, defines::Vector<double, 3>&>' requested
Мой вопрос сейчас: почему это не работает, и как я должен изменить это, чтобы это работало?Читая больше об итераторах, у меня возникло небольшое ощущение, что я не смогу найти общий тип для любого двунаправленного итератора, верно?Некоторые из классов могут хранить свои вершины в контейнерах, отличных от std :: vector, другие уже предоставляют итераторы (не соответствующие stl), которые я хочу адаптировать к своему общему типу.Я открыт для любых рекомендаций, как это реализовать.