簡體   English   中英

實施CRTP鏈表混入C ++

[英]Implementing a CRTP linked list mix-in C++

我無法讓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>

正如user2079303建議的,這是一個錯字。 這是clang++所說的:

$ clang++ -std=c++11 -c go.cpp 
go.cpp:6:5: error: missing return type for function 'AutoList'; did you mean the constructor name 'AutoSList'?
    AutoList() {}
    ^~~~~~~~
    AutoSList
go.cpp:8:6: error: expected the class name after '~' to name a destructor
    ~AutoList() {}
     ^~~~~~~~
     AutoSList
go.cpp:20:19: error: no member named '_head' in 'AutoSList<T>'
T*  AutoSList<T>::_head = nullptr;
    ~~~~~~~~~~~~~~^
go.cpp:24:25: error: use of undeclared identifier 'ADLib'
class itsybase : public ADLib::AutoSList < itsybase >
                        ^
4 errors generated.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM