变量或字段声明为void

时间:2014-11-13 08:21:48

标签: c++

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

我想要一个带有通用内容的简单链接列表:

但我得到了书面错误“变量或字段>>插入<< 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;  
 }

1 个答案:

答案 0 :(得分:1)

注意:您应该使用std::liststd::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::liststd::forward_list而不是推出自己的容器。没有必要重新发明轮子。