使用模板作为函数参数

时间:2015-02-04 06:33:04

标签: c++ templates

我正在尝试将我的代码转换为使用模板,因此我可以将任何类型传递给它。我正在从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;
    }
}

2 个答案:

答案 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对象,否则您将无法从外部调用它。