我已经阅读了大多数同样问题的帖子,但我没有在这些解决方案中找到我的问题。
我想要一个带有通用内容的简单链接列表:
但我得到了书面错误“变量或字段>>插入<< as void声明” 除了main之外的每个方法都有这个。
我希望你能帮助我, 感谢
#include<iostream>
#include<string>
//EDIT:#include"liste.t" this is waste from a former test
using namespace std;
template <typename T>
struct Element{
T value;
Element *next;
Element(T v, Element *n) : value(v), next(n)
{ }
};
template <typename T>
void insert(Element, T, int (*eq)(T,T));
template <typename T>
void remove(Element, T, int (*eq)(T,T));
void print(Element);
template <>
int equal<string>(T, T);
template <typename T>
int equal(T, T);
int main(){
int (*eq)(int,int) = equal;
Element* head=NULL;
insert(head, 2, eq);
insert(head, 5, eq);
insert(head, 1, eq);
print(head);
remove(head, 2, eq);
print(head);
}
template <typename T>
void insert(Element* &rp, T v, int (*eq)(T, T)){
if(rp!=NULL){
if(eq(rp->value, v)>=0){
rp = new Element(v, rp);
}else{
insert(rp->next, v, eq)
}
}else{
rp = new Element(v, NULL);
}
}
template <typename T>
void remove(Element * &rp, T v, int (*eq)(T, T)){
if(rp!=NULL){
if(eq(rp->value, v)==0){//v
Element *tmp = rp;
rp=rp->next;
delete tmp;
remove(rp,v, eq);
}else{
remove(rp->next, v, eq);
}
}
}
void print(Element *p){
while(p){
cout<<p->value << " ";
p=p->next;
}
cout << endl;
}
template <>
int equal<string>(T a, T b){
int min=0;
if(length(a)<length(b)){
min = length(a);
}else{
min=length(b);
}
for(int i=0; i< min; i++){
if(a[i]<b[i])
return -1;
if(a[i]>b[i])
return 1;
}
return 0;
}
template <typename T>
int equal(T a, T b){
if(a<b)
return -1;
if(a>b)
return 1;
return 0;
}
答案 0 :(得分:1)
注意:您应该使用std::list
或std::forward_list
而不是推出自己的容器。
在函数声明中,您将使用不带模板参数的Element遇到编译错误(这可能是您询问的错误):
template <typename T>
void insert(Element, T, int (*eq)(T,T));
^
这应该使用Element<T>
代替,并且还应该接受指向元素的指针。
template <typename T>
void insert(Element<T>*, T, int (*eq)(T,T));
print
函数也需要是一个模板:
template <typename T>
void print(Element<T> *p)
您似乎也尝试使用模板特化来专门化字符串的等号。声明应为:
template <>
int equal<string>(string, string);
因为在此上下文中未声明T。
我需要再次强调,你应该真的,真的考虑使用std::list
或std::forward_list
而不是推出自己的容器。没有必要重新发明轮子。