Two methods:
Method 1
You must not reference the class until it is defined. So you must do:
struct some_tree;
class some_tree_iterator
{
public:
// ...
private:
some_tree dereference() const;
// ...
};
struct some_tree
{
some_tree_iterator begin();
some_tree_iterator end();
std::string value() const;
};
some_tree some_tree_iterator::dereference() const { return some_tree( /*init values*/ ); };
STL Method:
Also, you may do like STL and define the iterator inside the struct some_tree
(in fact, STL's iterators are templates so they are defined in the class, even if declared elsewhere):
struct some_tree
{
class iterator
: public boost::iterator_facade<
iterator,
some_tree,
std::forward_iterator_tag,
some_tree>
{
public:
private:
some_tree dereference() const { return some_tree( /*init values*/ ); };
};
iterator begin();
iterator end();
std::string value() const;
};