// This gives errors:// 'invalid use of template-name ... without an argument list'template <class AA::A> template <class BB::B> Three<AA::A>::Three(const Three<BB::B> & other);
First, typenames are generally much easier to read without spaces in them.
Second, If you're trying to specialize this constructor, it would look more like
template <> Three<AA::A>::Three(const Three<BB::B>&);