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


Автор: silversmith 5.2.2010, 23:14
Добрый день.

есть файл vect.cpp с описанием шаблона вектора:
Код

#include<conio.h>
/*Элемент вектора*/
template <class data_t> class VectItem{
    data_t data;
    VectItem *next;
public:
    VectItem (data_t d){
        data = d;
        next = 0;
    }
    VectItem *getnext(){
        return next;
    }
    void setnext(VectItem* next){
        this->next = next;
    }
    data_t& getdata(){
        return data;
    }
    void add(VectItem *node){
        node->next = this;
        next = 0;
    }
};

/*Вектор*/
template <class data> class Vector{
    int count;
    VectItem<data> *first;
    VectItem<data> *last;
public:
    Vector(){
        count = 0;
        first = 0;
        last = 0;
    }
    ~Vector();
    void push_back(data);
    void pop_back();
    void insert(int,data);
    void erase(int);
    int size(){return count;}
    data& operator[](int);
};

template <class data> Vector<data>::~Vector(){
    VectItem<data> *vec = first;
    while(first){
        first = first->getnext();
        delete vec;
        vec = first;
    }
}

template <class data> void Vector<data>::push_back(data d){
    if(!first){
        first = new VectItem<data>(d);
        last = first;
    }
    else{
        VectItem<data> *vec = new VectItem<data>(d);
        vec->add(last);
        last = vec;
    }
    count++;
}

template <class data> void Vector<data>::pop_back(){
    if(first == last){
        delete first;
        first = 0;
        last = 0;
    }
    else{
        VectItem<data> *vec = first;
        while(vec != last)
            vec = vec->getnext();
        last = vec;
        vec = vec->getnext();
        delete vec;
    }
    count--;
}

template <class data> void Vector<data>::insert(int index,data d){
    VectItem<data> *vec = first;
    int i = 0;
    while(i < index){
        i++;
        vec = vec->getnext();
    }
    VectItem<data> *temp = new VectItem<data>(d);
    temp->setnext(vec->getnext());
    vec->setnext(temp);
    if(temp->getnext() == 0)
        last = temp;
    count++;
}

template <class data> void Vector<class data>::erase(int index){
    VectItem<data> *vec;
    if(index == 0){
        vec = first->getnext();
        delete first;
        first = vec;
    }
    else{
        VectItem<data> *temp;
        vec = first;
        int i = 0;
        while(i < index-1){
            i++;
            vec = vec->getnext();
        }
        temp = vec->getnext();
        vec->setnext(temp->getnext());
        if(temp == last)
            last = vec;
        delete(temp);
    }
    count--;
}

template <class data> data& Vector<class data>::operator[](int index){
    VectItem<data> *vec = first;
    for(;index;--index)
        vec = vec->getnext();
    return vec->getdata();
}


в другом файле я пишу:

Код

class TRadioGroup : public Drawable, public Runable{
.......
    Vector<char*> Items;
.......
public:
.....
    void func(){
                 cout << Items[1];
    }
.......
};


получаю ошибку
Linker error undefined symbol vector<char near *>::operator[](int)

при закомментаривании строчки
                 cout << Items[1];
ошибка пропадает. Так же ошибка пропадает когда я в main создаю объекты TRadioGroup.

интересно, что в других местах где инстанцирую шаблон вектора другими типами все ок. Компилятор Borland C++ 3.11

Автор: 586 6.2.2010, 01:52
Допиши в vect.cpp строку:
Код
template class Vector<char*>;

Автор: silversmith 6.2.2010, 09:27
Не помогло.

Автор: 586 6.2.2010, 16:32
А вот у тебя файл vect.cpp, а файл vect.h есть?
Как у тебя всё это подключается? Так что-ли:
Код
#include "vect.cpp"
?
Цитата
template <class data> data& Vector<class data>::operator[](int index){

слово "class" лишнее.

Автор: forumspy 7.2.2010, 04:32
Цитата(586 @ 6.2.2010,  16:32)
А вот у тебя файл vect.cpp, а файл vect.h есть?
Как у тебя всё это подключается? Так что-ли:
Код
#include "vect.cpp"
?
Цитата
template <class data> data& Vector<class data>::operator[](int index){

слово "class" лишнее.

 

Почему лишнее? По идее все правильно,должно работать.

Автор: silversmith 7.2.2010, 08:31
Да, у меня весь код шаблона в vect.cpp. vect.h нету. Подключается это:

Код

#include "vect.cpp"


лишние слова class убрал, но проблему это не решило. 

Дело в том, что когда я инстанцирую вектор другим типом данных все ок. К примеру у меня там есть абстрактный класс Drawable, без проблем создаю вектор 

Код

Vector<Drawable*> Controls;


И работаю с ним. Никаких проблем не возникает.

Автор: Леопольд 7.2.2010, 13:02
Цитата(silversmith @  7.2.2010,  08:31 Найти цитируемый пост)
    
#include "vect.cpp"

Предположу что у тебя не мэйкфайл написанный вручную, а ИДЕ, типа студии. Попробуй "убрать" файл из проекта. Т.е. не компилируй его вместе с остальными срр файлами. И вообще, переименуй его в hpp.

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