模板类链接列表插入错误

时间:2011-05-03 06:43:20

标签: c++ templates linked-list

当我尝试将此'food'对象插入到我的模板类链表'test'中时。我收到这个错误:

request for member ‘addNode’ in ‘test’, which is of non-class type ‘Catalog<FoodSource>()

这是我的编码,我做错了什么?

##main:##

int main(void)
{
    Catalog<FoodSource> test();
    FoodSource food();
    test.addNode(const &food);
    return(0);
}

##function definition in .h:##

template<class T>
class Catalog
{
    public:
        void addNode(const T& value);
};

 ##function implementation in .cpp:##

template <class T>
void Catalog<T>::addNode(const T& value)
{
    Node *temp;

    if(head == NULL)
        head = new Node (value, NULL);
    else
    {
        temp=head;

        while(temp->next !=NULL)
            temp=temp->next;

        temp->next = new Node (value, NULL);
    }
}

3 个答案:

答案 0 :(得分:4)

您刚刚发现了C ++语法中存在的众多瑕疵之一。该标准要求如果表达式既可以解释为声明,也可以解释为定义,则必须将其视为声明。例如你的代码

Catalog<FoodSource> test();

没有定义名为test的变量,而是声明有一个名为test的函数,它不带任何参数,并返回Catalog<FoodSource>个实例。

要定义变量,您需要省略括号。

请注意,有些情况下很难注意到这个陷阱......例如:

double x = 3.14159;
int y(int(x));

令人惊讶的是,它可能出现在上面的代码中y is declared as a function

答案 1 :(得分:0)

类模板的声明和实现应为in the same file

此外,您只需拨打test.addNode(food);中的main

答案 2 :(得分:0)

给定Node,FoodSource等所有类的定义,您至少需要执行以下操作:

1)将功能定义移动到.h文件

2)main函数的第一行是ambigous。它应该被重写为Catalog<FoodSource> test;,因为Catalog<FoodSource> test()将被视为函数原型