Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Помогите с ошибкой LNK2019


Автор: PirateTigo 4.8.2008, 06:56
Что сказал линкер:
Код

Linking...
Main.obj : error LNK2019: unresolved external symbol "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class List<class NumString> &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$List@VNumString@@@@@Z) referenced in function _main
C:\Documents and Settings\Tigo\Мои документы\Visual Studio 2005\Projects\Lab4\Debug\Lab1.exe : fatal error LNK1120: 1 unresolved externals


Код собственно:
Код

#ifndef _List

#include <string.h>
#include <string>
#include <stdlib.h>
#include <iostream>

using namespace std;

template <class T>
struct Elem {
    Elem<T> *Next;                    //Next element
    T *Obj;                            //Object
};

template <class T>
class List {
    int N;                            //Number of elements
    Elem<T> *Head;                    //Head of list
public:
//Constructors
    List(void);
    List(T);

//Methods
    void AddElem (T&, int);            //Additional Elem to List by logical number
    void DelElem (int);                //Delete Elem by logical number
    int Max (int);                    //Search maximum of elements
    int Min (int);                    //Search minimum of elements
    void Sort (void);                //Sorting insets
    Elem<T> *Get (int);                //Get point to Elem by set number

    //friend std::istream &operator>>(std::istream &,List<T> &);
    friend std::istream &operator>>(std::istream &, List<T> &);
};

template <class T>
List <T>::List(T Obj)
{
    N=1;
    Head=new Elem<T>;
    Head->Next=NULL;
    Head->Obj=new T;
    *(Head->Obj)=Obj;    
};

template <class T> 
List <T>::List(void)
{
    N=0;
    Head=NULL;
};

template <class T>
void List <T>::AddElem(T &AElem, int Num)
{
    if (N==0) {
        N=1;
        Head=new Elem<T>;
        Head->Next=NULL;
        Head->Obj=new T;
        *(Head->Obj)=AElem;
        return;
    }
    if (N<Num) {
        Elem<T> *p=Head;
        for (;p->Next!=NULL;p=p->Next);
        p->Next=new Elem<T>;
        p->Next->Next=NULL;
        p->Next->Obj=new T;
        *(p->Next->Obj)=AElem;
        N++;
        return;
    }
    if (Num<=1) {
        Elem<T> *q,*p=Head;
        q=new Elem<T>;
        q->Next=p;
        Head=q;
        q->Obj=new T;
        *(q->Obj)=AElem;
        N++;
        return;
    }
    Elem<T> *q=Head,*p=q->Next;
    for(int i=2;i<Num;i++,q=p,p=p->Next);
    q->Next=new Elem<T>;
    q->Next->Next=p;
    q->Next->Obj=new T;
    *(q->Next->Obj)=AElem;
    N++;
    return;
}

template <class T>
void List<T>::DelElem(int Num)
{
    Elem<T> *q=Head,*p=q->Next;
    if ((Num<1)||(Num>N)) return;
    if (Num!=1) {
        for (int i=2;i<Num;i++,q=p,p=p->Next);
        delete p->Obj;
        p=p->Next;
        delete q->Next;
        q->Next=p;
        N--;
        return;
    }
    delete q->Obj;
    delete q;
    Head=p;
    N--;
    return;
}

template <class T>
int List<T>::Max(int k)
{
    int i,m=1;
    if (Head==NULL) return NULL;
    Elem<T> *q=Head,*p=q->Next;
    for (i=1;p!=NULL&&i<k;p=p->Next,i++)
        if (*(q->Obj)<*(p->Obj)) {
            q=p;
            m=i+1;
        }
    return m;
}

template <class T>
int List<T>::Min(int k)
{
    int i,m=1;
    if (Head==NULL) return NULL;
    Elem<T> *q=Head,*p=q->Next;
    for (i=1;p!=NULL&&i<k;p=p->Next,i++)
        if (*(q->Obj)>*(p->Obj)) {
            q=p;
            m=i+1;
        }
    return m;
}

template <class T>
void List<T>::Sort(void)
{
    for (int k=N;k>0;k--){
        int m=Min(k);
        T PObj;
        PObj=*(Get(m)->Obj);
        DelElem(m);
        this->AddElem(PObj,N+1);
    }
    return;
}

template <class T>
Elem<T> *List<T>::Get(int k)
{
    Elem<T> *q=Head;
    if (k<1) return NULL;
    for (int i=1;i!=k&&q!=NULL;q=q->Next,i++);
    return q;
}

/*template <class T> 
std::istream &operator>>(std::istream& IO, List<T> &Spisok)
{
    *T Obj;
    IO >> Obj;
    Spisok.AddElem(Obj,0);
    return IO;
}*/
template <class T>
std::istream &operator>>(std::istream &IO, List<T> &Spisok)
{
    T Obj;
    IO >> Obj;
    Spisok.AddElem(Obj,0);
    return IO;
}

#define _List
#endif


Помогите чем сможете, пожалуйста =) Всем заранее спасибо

Автор: knut 4.8.2008, 08:42
PirateTigo, 
определение и реализация шаблона должны быть в огном фаиле.(одна еденица трансляции)

Автор: PirateTigo 4.8.2008, 09:01
Так они у меня и так в одном файле  smile 

Автор: knut 4.8.2008, 09:06
PirateTigo, 
у меня 2008 и он компелит на ура а у вас какая студия?

Добавлено через 8 минут и 45 секунд
с кодом( с точки зрения компиляции у вас все впорядке должно и компилится и линковатся без проблем)

Автор: vinter 4.8.2008, 11:15
что такое NumString?
где для него определен >>?

Автор: PirateTigo 4.8.2008, 14:13
Нашел в чем проблема! =) Оказывается при объявлении дружественных шаблонов функций для шаблона класса нужно либо заранее объявлять прототипы класса и функции, либо писать <> после названия функции. В моем случае в строке 34: 
Код

 friend std::istream &operator>><>(std::istream &, List<T> &);


Добавлено через 4 минуты и 41 секунду
Все равно спасибо за внимание  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)