我正在尝试在mylist类中定义一个mylist对象。
这是我的代码:
mlist.h
#ifndef MLIST_H
#define MLIST_H
#endif // MLIST_H
#include "mylist.h"
template <class T> class mlist
{
protected:
T item = 0;
mylist<T> next = 0;
};
mylist.h
#ifndef MYLIST_H
#define MYLIST_H
#include "mlist.h"
template <class T> class mylist : mlist<T>
{
private:
T item;
mylist<T>* next;
// --- some functions ---
};
#endif // MYLIST_H
错误:
错误:'mylist'没有命名类型
mylist next = 0;
我的问题:出了什么问题以及这样做的正确方法是什么?
答案 0 :(得分:1)
您无法在其定义中定义类的具体对象,因为在编译器看到对象定义时,它对其类一无所知。
但是,您可以在类的定义中定义指向同一个类的对象的指针。
此外,您的代码还存在循环依赖问题。
现在,为了解决这个问题,您必须在template class mylist
的定义之前转发声明template class mlist
。但是,如果您这样做,则会引入另一个问题,即您在class mylist
的定义中不能有class mlist
的具体对象。同样,这可以通过在class mylist
的定义中定义指向class mlist
对象的指针来解决:
template<class T> class mylist;
template <class T>
class mlist {
protected:
T item;
mylist<T>* next;
};
template <class T>
class mylist : mlist<T> {
T item;
mylist<T>* next;
};
int main() {
mylist<int> lst;
(void) lst;
}
答案 1 :(得分:0)
我正在尝试在mylist类中定义一个mylist对象。
实际上,这不是你尝试做的一切。您尝试在my list
和mylist
中同时拥有mlist
成员。我认为你尝试使用C ++中不存在的东西 - 纯虚拟成员。行
protected:
T item = 0;
mylist<T> next = 0;
看起来你想要它。这也导致mlist
和mylist
之间的相互依赖,因为您尝试在mylist
中拥有mlist
成员,并且您尝试从mylist
派生mlist
}。
删除我上面引用的行,你的编译错误应该消失。