Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка Unresolved external 
:(
    Опции темы
silversmith
Дата 5.2.2010, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.12.2007
Где: Донецк, Украина

Репутация: нет
Всего: нет



Добрый день.

есть файл 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


Это сообщение отредактировал(а) silversmith - 5.2.2010, 23:47
PM MAIL WWW ICQ   Вверх
586
Дата 6.2.2010, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



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

PM   Вверх
silversmith
Дата 6.2.2010, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.12.2007
Где: Донецк, Украина

Репутация: нет
Всего: нет



Не помогло.
PM MAIL WWW ICQ   Вверх
586
Дата 6.2.2010, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



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

слово "class" лишнее.
PM   Вверх
forumspy
Дата 7.2.2010, 04:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.2.2010

Репутация: нет
Всего: нет



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

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

 

Почему лишнее? По идее все правильно,должно работать.
PM MAIL   Вверх
silversmith
Дата 7.2.2010, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.12.2007
Где: Донецк, Украина

Репутация: нет
Всего: нет



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

Код

#include "vect.cpp"


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

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

Код

Vector<Drawable*> Controls;


И работаю с ним. Никаких проблем не возникает.
PM MAIL WWW ICQ   Вверх
Леопольд
Дата 7.2.2010, 13:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(silversmith @  7.2.2010,  08:31 Найти цитируемый пост)
    
#include "vect.cpp"

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


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0917 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.