gpt4 book ai didi

c++ - 如何使用 "Curiously recurring template"模式

转载 作者:太空宇宙 更新时间:2023-11-04 11:42:01 25 4
gpt4 key购买 nike

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

情况是我必须申请较早的书面类(class),这是按某种模式设计的,我无权更改它。不幸的是,我不知道它是哪种模式,也不知道如何使用它。

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

代码是这样的:

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 类。但它没有用。比我认为也许我自己的类(将存储在列表中)应该从 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'

最佳答案

你忘记了 public :

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

关于c++ - 如何使用 "Curiously recurring template"模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21038931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com