2013-05-27 46 views
0

因此,从.csv文件我创建用户,这是从用户类。我试图创建一个链表,它将包含所有的用户,但我得到一个错误插入到链接列表中,顺便提一句名为“ListaLigada”。我无法自己弄清楚。无法解析的外部符号链接列表实现与模板C++

所以,这就是我得到:

错误1个错误LNK2019:无法解析的外部符号 “市民:无效 __thiscall ListaLigada ::插入(类用户)”(插入@ $ ListaLigada? @VUser @@@@ QAEXVUser @@@ Z)功能 “void __cdecl genUserLList(class ListaLigada &)” (?genUserLList @@ YAXAAV?$ ListaLigada @ VUser @@@@@ Z)C:\ Users \ Daniel \ documents \ visual studio 2010 \ Projects \ Radio Station \ Radio Station \ Auxf.obj Radio Station

如果你能确定我做错了什么,我会成为你的朋友,现在已经很长时间了。

下面是相关的代码:

ListaLigada.h

#pragma once 
    #ifndef ListaLigada_H 
    #define ListaLigada_H 

    #include <cstddef> 
    #include <cassert> 

    template<class T> 
    class ListaLigada 
    { 
    public: 
     ListaLigada(); 
     ListaLigada(T elem); 
     ~ListaLigada(void); 

      void insert(T elem); 
     void remElem(T elem); 
     void remElem(int id_elem); 
     void searchElem(int id_elem); 
     void searchElem(T elem); 
     void clear(); 

    private: 
     struct Node{ 
      T data; 
      Node *next; 
      Node *prev; 
     } *p; 

     size_t list_size; 
    }; 


    #endif 

ListaLigada.cpp

#include "ListaLigada.h" 
    template<class T> 
    ListaLigada<T>::ListaLigada() 
    { 
     list_size=0; 
     this->p=new Node; 
     this->p=NULL; 
    } 

    template<class T> 
    ListaLigada<T>::~ListaLigada(void) 
    { 
     clear(); 
    } 

    template<class T> 
    ListaLigada<T>::ListaLigada(T elem) 
    { 
     node *q, *t; 
     if(p == NULL) 
     { 
      p=new Node; 
      p->data= elem; 
      p->next= Null; 
      list_size++; 
     } 
     else 
     { 
      q=p; 
      while(q->next!= NULL) 
       q= q->next; 
      t= new node; 
      t->data= elem; 
      t->next=Null; 
      t->prev=q; 
      q->next=t; 
      list_size++; 
     } 
    } 

    template <class T> 
    void ListaLigada<T>::insert(T elem) 
    { 
     node *q, *t; 
     if(p == NULL) 
     { 
      p=new Node; 
      p->data= elem; 
      p->next= NULL; 
      list_size++; 
     } 
     else 
     { 
      q=p; 
      while(q->next!= NULL) 
       q= q->next; 
      t= new node; 
      t->data= elem; 
      t->next=NULL; 
      t->prev=q; 
      q->next=t; 
      list_size++; 
     } 
    } 

    template <class T> 
    void ListaLigada<T>::remElem(T elem) 
    { 
     node *q, *t; 
     if(p== NULL) 
     { 
      system("cls"); 
      cout<<"There's nothing to remove\n"; 
      _getch(); 
     } 
     else 
     { 
      q=p; 
      while(q->next != NULL){ 
       //e se for o unico elemento? 
       if(list_size==1) 
       { 
        ~ListaLigada(); 
       //blahblah limpar ficheiros 
        break; 
       } 
       else 
       { 
        if(q->data.getId() ==) 
       } 

      } 
     } 

    } 

    template <class T> 
    void ListaLigada<T>::remElem(int id_elem){} 

    template <class T> 
    void ListaLigada<T>::searchElem(int id_elem){} 

    template <class T> 
    void ListaLigada<T>::searchElem(T elem){} 

    // deletes all the list elements 
    template <class T> 
    void ListaLigada<T>::clear() 
    { 
    node *q; 
    if(p == NULL) 
    return; 
    while(p != NULL) 
    { 
    q = p->next; 
    delete p; 
    p = q; 
    listSize--; 
    } 
    //assert(listSize==0); 
    } 

auxf.h

#ifndef AUX_H 
#define AUX_H 

//#include "includes.h" 
#include "ListaLigada.h" 
#include "Music.h" 
#include "User.h" 
#include "RadioStation.h" 
#include <conio.h> 
#include <string> 
#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <iomanip> 
#include <list> 

#define MIN_LEN 2 

bool strMinLen(string str, int min_len); 
void fillField(string &to_fill, const string &what_is); 
void checkFiles(); 
void loadInfo(vector<int> &vec); //carrega ids maximos 
void regUser(); 
void addMusic(); 
void updateRestoreTxt(const int &line); 
void loadRestore(); 
void updateRestore(); 
//void genUserLList(list<User> &lista); 
void genUserLList(ListaLigada<User>); 


#endif 

auxf.cpp //生病 只发布相关的功能

void genUserLList(ListaLigada<User> &lista){ 
    ifstream ifs; 
    ifs.open("users.csv"); 
    if(ifs){ 
     int to_read; 
     to_read=getNUsers(); //nr of users to read 


     string user_line; 
     getline(ifs, user_line, ','); //linha cabecalho 
     for(int i=0; i<to_read; i++){ 

      user_line.clear(); 

      string name, password; 
      int age; 
      char gender; 
      unsigned int id=0; 

      getline(ifs, user_line); 

      stringstream sstream; 
      sstream<<user_line; 
      string tmp; 
      stringstream sstmp; 
      char delim= ','; 

      getline(sstream, tmp, delim); 
      sstmp<<tmp; 
      sstmp>>id; 
      sstmp.clear(); 
      tmp.clear(); 

      getline(sstream, name, ','); 

      getline(sstream, tmp, ','); 
      sstmp<<tmp; 
      sstmp>>age; 
      sstmp.clear(); 
      tmp.clear(); 

      getline(sstream, tmp, ','); 
      sstmp<<tmp; 
      sstmp>>gender; 
      sstmp.clear(); 
      tmp.clear(); 

      getline(sstream, password, ','); 

      User n_user(id, name, age, gender, password); 
      /*list<User>::iterator it; 
      it=lista.end(); 
*/ 
      lista.insert(n_user); 
     } 
    } 
    else{ 
     cout<<"Lista Ligada ta fdd\n"; 
     _getch(); 
    } 
} 

在此先感谢。我不知道该怎么办......我正在阅读用户

+0

的[可能重复什么是未定义参考/解析的外部符号错误,我该如何解决?模板实现不可见](http://stackoverflow.com/a/12574417/902497)。 –

回答

5

当您使用模板化类时,需要定义完整,并且还包括所有方法。因此,您无法将模板化类分割为头文件和源文件,因此所有内容都必须位于头文件中。

+2

那么,如果实现文件具有所需的专业化,那么您**可以将其拆分为头文件和源文件。 – 2013-05-27 14:08:56

+1

仅供参考请参阅14.7.2 - 显式实例化。 –

+0

谢谢,它解决了我的问题。这让我疯狂。尽管如此,我发现使用stl列表更容易,但麻烦更少。但它现在正在工作,谢谢。 –

0

你不能在其他编译单元中实现模板类,那么你想使用它。

您应该在标题中完成所有操作,或者将此实现包含到您的标题中以使其更具可读性。

原因在于专用模板类的代码在使用时会生成。如果你只想使用一些众所周知的模板类专业化,你可以使用从头部分离的实现,并强制创建专业化。

这里多一些: Why can templates only be implemented in the header file?

+0

也感谢你的帮助。链接是有用的了解其余的。 –

相关问题