¿Clase base privada errónea inaccesible?

Compilar este código usando g ++ 4.2.1:

struct S { };
template<typename T> struct ST { };

template<typename BaseType>
class ref_count : private BaseType { };

template<typename RefCountType>
class rep_base : public RefCountType { };

class wrap_rep : public rep_base<ref_count<S> > {
  typedef rep_base<ref_count<S> > base_type;      // line 11
};

Yo obtengo:

bug.cpp:1: error: ‘struct S’ is inaccessible
bug.cpp:11: error: within this context

Sin embargo, si cambio elwrap_rep clase para usarST:

class wrap_rep : public rep_base<ref_count< ST<int> > > {
  typedef rep_base<ref_count< ST<int> > > base_type;
};

Se compila bien. Alternativamente, si cambio el código original a:

class wrap_rep : public rep_base<ref_count<S> > {
  typedef rep_base<ref_count< ::S > > base_type;  // now using ::
};

También compila bien. Para mí, el código original parece estar bien tal como está. ¿Es esto un error de g ++? Si no es así, ¿por qué funciona el uso de una plantilla? Y, para el otro caso, ¿por qué es el::S ¿necesario?

Respuestas a la pregunta(3)

Su respuesta a la pregunta