如何使用“奇怪的重复模板”模式

时间:2014-01-10 08:00:47

标签: c++ templates design-patterns linked-list crtp

我不确定是否允许这样的问题。但是我无法真正理解应该在我的程序中使用的代码。

情况是我必须应用一个早期的写作类,这是按照某种模式设计的,我没有权利改变它。不幸的是,我不知道它是哪种模式,也不知道如何使用它。

(故事是关于链表模板。)

代码是这样的:

template<typename T> class LListNode {
public:
  LListNode();
  void setNext(T*);
  ...
  T* next() const;
};

template<typename T> inline void LListNode<T>::setNext(T* next) {
  static_cast<T*>(this)->m_next = next;
}
...

这是节点类,接下来是主列表类:

template<typename T> class LList {
public:
  LList();

  bool isEmpty() const;
  ...
  T* head() const;
  ...
  void push(T*);
  ...
private:
  T* m_head;
  T* m_tail;
};

首先,我尝试使用我自己的类作为模板类来实例化LList类。但它没有奏效。我认为也许我自己的类(将存储在List中)应该从LListNode类继承。多数民众赞成似乎是一个好主意,但随后我陷入困境。

如何定义从另一个类继承的类,它将当前定义的类作为模板参数?

只是说清楚:

class Foo : LListNode<Foo> {
private:
  Foo* m_next;
public:
  ...

此时我的编译器(gcc(Ubuntu / Linaro 4.6.4-1ubuntu1~12.04)4.6.4 哭了:

In instantiation of 'void LListNode<T>::setPrev(T*) [with T = Foo]': 
required from LListNode<T>::LListNode() [with T = Foo]'
Foo.h:   required from here
LList.h: error: LListNode<Foo>' is an inaccessible base of 'Foo'

1 个答案:

答案 0 :(得分:1)

您忘记了public

class Foo : public LListNode<Foo> {
private:
  Foo* m_next;
public:
  ...