我不确定是否允许这样的问题。但是我无法真正理解应该在我的程序中使用的代码。
情况是我必须应用一个早期的写作类,这是按照某种模式设计的,我没有权利改变它。不幸的是,我不知道它是哪种模式,也不知道如何使用它。
(故事是关于链表模板。)
代码是这样的:
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'
答案 0 :(得分:1)
您忘记了public
:
class Foo : public LListNode<Foo> {
private:
Foo* m_next;
public:
...