基本的に、ジェネリック イテレータを含む基本クラスを作成しようとしています。
どうやらテンプレート仮想関数が機能しないため、boost::any を試しましたが、Iterator の get() メソッドをオーバーロードしていません (以下に定義されている Exception をスローし続けます)。また、コンパイラが「仮想反復子 begin() = 0;」について不平を言うため、純粋な仮想にすることもできないようです。(「抽象クラス Iterator のインスタンスを作成できません」と表示されます)。
遵守しなければならない/遵守したい非常に具体的な制約があるため、問題の代替ソリューションが検討される可能性がありますが、おそらく使用できません。
コードの一部を次に示します。
template <class T, class C>
class Iterator
{
public:
virtual T& operator*() { T *t = boost::any_cast<T>(&get()); return *t; };
virtual boost::any& get() { throw new Exception("get not overridden!!"); };
//virtual boost::any& get() = 0;
protected:
C::iterator iter;
};
template <class T>
class VectorIterator: public Iterator<T, std::vector<T> >
{
public:
VectorIterator(std::vector<T>::iterator iterator): Iterator<T, std::vector<T> >(iterator) { };
virtual boost::any& get() { return *iter; };
};
template <class Value, class Container>
class Repository
{
public:
typedef Iterator<Value, Container> iterator;
virtual iterator begin() = 0;
virtual iterator end() = 0;
};
class SomeRepository : public Repository<RandomClass, std::vector<RandomClass> >
{
public:
iterator begin() { return VectorIterator<RandomClass>(items.begin()); };
iterator end() { return VectorIterator<RandomClass>(items.end()); };
}
では、なぜ機能しないのでしょうか? (どうすれば) 修正できますか?
PS:これは別の質問と非常に似ていることは知っていますが、これをコメントに正確に収めることができず、他にどこに置くことができるか本当にわかりませんでした.
アップデート:
そこで、get() に void (eww) ポインターを返させ、boost::any を忘れることで、なんとか解決しました。しかし、それはまだ VectorIterator::get の代わりに Iterator::get を呼び出します (私の元の問題と同様に) (*someRepository.begin() のようなものを使用しようとすると)、誰かが理由を知っていますか?