次のコード (単純な CRTP クラス階層) があるとします。入力を節約するために基本クラスの型を typedef したい (実際のコードでは、基本クラスの型を複数回使用し、基本クラスはいくつかのテンプレート パラメーターを受け取ります)。実装は非公開です。
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;
これを修正するにはどうすればよいですか? フレンド クラスの宣言のためだけにすべてを入力するだけで問題なく動作することに気付きましたが、ほんの少しの重複したコードでも少し不快に感じるので、よりエレガントな「適切な」ソリューションを探しています。 .