我正在尝试将我的代码转换为使用模板,因此我可以将任何类型传递给它。我正在从java学习C ++,所以我不知道如何用c ++方式来学习它。我收到一个未声明的标识符错误。我只是展示了一小部分代码。我希望我的函数接受任何类型的输入。在Java中我只会使用泛型。
class LList
{
private:
template <typename T> struct ListItem
{
T item;
ListItem* next;
};
int size;
ListItem<int> *head;
public:
void AddFront(ListItem<T> i) //This is the error
{
ListItem<T> *li = new ListItem<T>;
li->item = i;
li->next = head;
head = li;
++size;
}
}
答案 0 :(得分:1)
我相信以下修改可以解决您的问题。 注意:如果这只是为了学习,那么就是这样,否则您应该使用标准容器(例如std::vector<T>
,std::list<T>
等)。
template<typename T> // Added
class LList
{
private:
struct ListItem
{
T item;
ListItem* next;
};
int size; // This should probably be 'size_t'
// ListItem<int> *head; // <- Why did you hard-code to 'int'?
ListItem *head;
public:
// void AddFront(ListItem<T> i) //This is the error
void AddFront(T i)
{
ListItem *li = new ListItem;
li->item = i;
li->next = head;
head = li;
++size;
}
}
答案 1 :(得分:0)
您的班级List
没有任何模板参数,只有ListItem<int>
类型才能使用列表项,因为这是head
可以指向的内容。如果您想要通用List
,则必须是模板。
当您List
模板时,List
中的内容不应再是显式模板,因为它们是隐式模板,作为类模板的成员。
template <typename T> // <-- add
class LList
{
private:
// template <typename T> <-- remove, not needed
struct ListItem
{
T item;
ListItem* next;
};
int size;
ListItem *head; // <--- No <T>, no <int>
public:
void AddFront(ListItem i) // <--- No <T>
{
ListItem *li = new ListItem; // <--- No <T>
li->item = i;
li->next = head;
head = li;
++size;
}
};
请注意, public AddFront
会使用私有 ListItem
参数。除非您从某处获得ListItem
对象,否则您将无法从外部调用它。