На самом деле проблема в том, что объявление HostPtr
еще не было видно, когда вы наследуете от политики.Существует некоторая дискуссия о точной семантике, в которой эти объявления видны созданными экземплярами шаблонов, что имеет довольно сложные проблемы, см. этот отчет о дефектах .
Но в вашем случае ситуация ясна: до тела класса ни один код не может видеть никаких объявлений членов класса, и поэтому ваш код завершается ошибкой.Вы можете передать тип в качестве аргумента шаблона
template <template <class,class> class P>
struct Host : public P<Host<P>, Host<P>* > {
typedef P<Host<P> > Base;
Host(const Base& p) : Base(p) {}
};
template <class H, class Hptr>
struct Policy {
typedef Hptr HostPtr;
HostPtr clone() const {
return Hptr(new H((Hptr)this));
}
};
Если есть еще типы, вы можете решить передать черту
template <class Host>
struct HTraits {
typedef Host *HostPtr;
// ...
};
template <template <class,class> class P>
struct Host : public P<Host<P>, HTraits< Host<P> > > {
typedef P<Host<P> > Base;
Host(const Base& p) : Base(p) {}
};
template <class H, class Htraits>
struct Policy {
typedef typename Htraits::HostPtr HostPtr;
HostPtr clone() const {
return Hptr(new H((Hptr)this));
}
};