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;
};
VertexBasedGeometry から継承する TraingleMesh では、頂点を含む std::vector の begin イテレータを返すことで関数 begin を実装しようとしています。これにより、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 に準拠していない) イテレーターが既に提供されています。これを実装する方法についての推奨事項をお待ちしています。