内部类模板循环引用

Sas*_*sha 5 c++ templates

有谁知道如何欺骗C++编译器来编译类似的东西(条件是TheObservedObject保留在MyClass中):

template< typename Type >
class Observabile
{
public:
   typename typedef Type::TheObservedObject TheObject;

   void Observe( TheObject& obj ) {}
};

class MyClass : public Observabile< MyClass >
{
public:
   class TheObservedObject
   {
   };
}
Run Code Online (Sandbox Code Playgroud)

Xeo*_*Xeo 1

遗憾的是,这不可能直接实现,因为MyClass在实例化 时Observable尚未完成,因此您无法访问任何typedefs。您可以通过添加一个小包装来解决此问题:

template< typename Type, typename Wrapper >
class Observable
{
public:
   typename typedef Wrapper::TheObservedObject TheObject;

   void Observe( TheObject& obj ) {}
};

struct MyClassWrapper{
   class TheObservedObject
   {
   };
};

class MyClass : public Observable< MyClass, MyClassWrapper>
{
public:
    typedef MyClassWrapper::TheObservedObject TheObservedObject;
};
Run Code Online (Sandbox Code Playgroud)

或者一般只是TheObservedObject放在MyClass(Wrapper).