我无法让CRTP mixin正常工作。

这是简化的实现:

template < typename T >
class AutoSList : public T {
public:
  AutoSList() {}

  ~AutoSList() : _next(nullptr) {}


private:
  static T* _head;
  static T* _tail;
  T* _next;

};

// I really hate this syntax.
template <typename T>
T*  AutoSList<T>::_head = nullptr;
template <typename T>
T*  AutoSList<T>::_tail = nullptr;

class itsybase : public AutoSList < itsybase >
{

};


我正在使用VS2013并收到以下错误:

   error C2504: 'itsybase' : base class undefined
 : see reference to class template instantiation 'AutoSList<itsybase>' being compiled


我不知道出了什么问题,有什么建议吗?

最佳答案

导致这些编译错误的有2个问题。首先是一个错字,导致与c-tor / d-tor和类名不匹配。

第二个问题是您试图继承父模板中的T。这在CRTP中是不可能的,因为在实例化模板时类型将不完整。无论如何,这将导致无限递归继承:itsybase继承AutoSList<itsybase>继承itsybase后者继承AutoSList<itsybase> ...

关于c++ - 实现CRTP链表混入C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28721120/

10-11 22:06