Ошибка «разработанный тип относится к typedef» при попытке подружиться с typedef
Допустим, у меня есть следующий фрагмент кода (простая иерархия классов CRTP). Я хочу определить тип базового класса, чтобы сохранить типизацию (в моем коде я использую тип базового класса более одного раза, а базовый класс принимает несколько параметров шаблона), и мне нужно подружиться с базовым классом, так как я хочу сохранить реализация частная.
template< class D >
class Base
{
public:
void foo() { *static_cast< D * >(this)->foo_i(); }
};
template< class T >
class Derived : public Base< Derived< T > >
{
public:
typedef class Base< Derived< T > > BaseType;
private:
// This here is the offending line
friend class BaseType;
void foo_i() { std::cout << "foo\n"; }
};
Derived< int > crash_dummy;
лязг говорит:
[...]/main.cpp:38:22: error: elaborated type refers to a typedef
friend class BaseType;
^
[...]/main.cpp:33:44: note: declared here
typedef class Base< Derived< T > > BaseType;
Как я могу это исправить? Я заметил, что могу просто напечатать все это только для объявления класса друга, и это прекрасно работает, но даже небольшой дублированный код заставляет меня чувствовать себя немного неловко, поэтому я ищу более элегантное «правильное» решение ,