当我尝试将此'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);
}
}
答案 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()
将被视为函数原型