gpt4 book ai didi

c++ - 声明为 void 的变量或字段

转载 作者:行者123 更新时间:2023-11-28 06:35:04 26 4
gpt4 key购买 nike

我已经阅读了大多数有相同问题的帖子,但我没有在这些解决方案中找到我的问题。

我想编写一个包含通用内容的简单链表:

但我收到书面错误“变量或字段 >>insert<< as void declared”这适用于除主要方法之外的每个方法。

我希望你能帮助我,谢谢

#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;
}

最佳答案

注意:您可能应该使用 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)

您似乎也在尝试使用模板特化对字符串进行特化 equals。声明应为:

template <>
int equal<string>(string, string);

因为 T 没有在这个上下文中声明。

我需要再次强调,你真的应该考虑使用 std::liststd::forward_list而不是推出自己的容器。无需重新发明轮子。

关于c++ - 声明为 void 的变量或字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26904249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com