Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема линковки шаблонного класса 
V
    Опции темы
livo
Дата 6.8.2010, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Создал класс, управляющий списком. При попытке пролинковать этот класс в готовый исполняемый файл билдер выдает ошибки:

[Linker Error] Unresolved external '__fastcall TBasicList<int>::~TBasicList<int>()' referenced from D:\UNIT1.OBJ
[Linker Error] Unresolved external '__fastcall TBasicList<int>::TBasicList<int>()' referenced from D:\UNIT1.OBJ
//и такого же рода ошибки для всех методов, что вызывались в Unit1

Код класса:
Код

#ifndef BASICLISTH
#define BASICLISTH
#include <list>
template<class DataType>
class TBasicList
{
  public:
    typedef void __fastcall (__closure *TOnModify)(TBasicList*,int,DataType*,bool&);
    typedef void __fastcall (__closure *TOnModified)(TBasicList*,int,DataType*);
  private:
    typedef std::list<DataType> TLIST;
    TLIST list;
    TOnModify FOnAdd,FOnDelete;
    TOnModified FOnAdded,FOnDeleted;
    DataType __fastcall GetItem(unsigned index);
    void __fastcall SetItem(unsigned index, DataType val);
    unsigned __fastcall GetCount();
  public:
    __fastcall TBasicList();
    __fastcall TBasicList(const TBasicList &bl);
    __property DataType Item[unsigned index]={read=GetItem,write=SetItem};
    __property unsigned Count={read=GetCount};
    __property TOnModify OnAdd={read=FOnAdd,write=FOnAdd};
    __property TOnModify OnDelete={read=FOnDelete,write=FOnDelete};
    __property TOnModified OnAdded={read=FOnAdded,write=FOnAdded};
    __property TOnModified OnDeleted={read=FOnDeleted,write=FOnDeleted};
    TBasicList& __fastcall operator=(const TBasicList &bl);
    void __fastcall Add(DataType val);
    void __fastcall Insert(unsigned index,DataType val);
    void __fastcall Del(unsigned index);
    void __fastcall Clear(); 
    virtual __fastcall ~TBasicList();
};
#endif

Далее код Unit1:
Код

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
//...
#include "..\myclasses\basiclist.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
//...
private:    // User declarations
        typedef int btype;
        TBasicList<btype> bli;
        void __fastcall on_add(TBasicList<btype> *bl,int index,btype *data,bool &can);
        void __fastcall on_added(TBasicList<btype> *bl,int index,btype *data);
        void __fastcall on_delete(TBasicList<btype> *bl,int index,btype *data,bool &can);
        void __fastcall on_deleted(TBasicList<btype> *bl,int index,btype *data);
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//...
#endif

Код

//...
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 randomize();
 bli.OnAdd=on_add;
 bli.OnAdded=on_added;
 bli.OnDelete=on_delete;
 bli.OnDeleted=on_deleted;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::on_add(TBasicList<btype> *bl,int index,btype *data,bool &can)
{
 //...
}
//---------------------------------------------------------------------------
void __fastcall TForm1::on_added(TBasicList<btype> *bl,int index,btype *data)
{
//...
}
//---------------------------------------------------------------------------
void __fastcall TForm1::on_delete(TBasicList<btype> *bl,int index,btype *data,bool &can)
{
 //...
}
//---------------------------------------------------------------------------
void __fastcall TForm1::on_deleted(TBasicList<btype> *bl,int index,btype *data)
{
//...
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnPlusClick(TObject *Sender)
{
 bli.Add(edtDig->Text.ToInt());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnInsertClick(TObject *Sender)
{
 int i=rand()%lstDigs->Count;
 bli.Insert(i,edtDig->Text.ToInt());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnDelClick(TObject *Sender)
{
 int i=rand()%lstDigs->Count;
 bli.Del(i);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnClearClick(TObject *Sender)
{
 bli.Clear();       
}

Кодовый модуль класса TBasicList был включен в проект командой Projec->Add to Project....
У всех методов выполнены реализации и выполнены правильно. Модуль класса компилируется. А вот линковаться не хочет. Почему?
PM MAIL   Вверх
Dem_max
Дата 6.8.2010, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Не нашел у тебя в коде функцию конструктора __fastcall TBasicList();, линковщик его тоже не нашел


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
livo
Дата 6.8.2010, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

У всех методов выполнены реализации и выполнены правильно

Dem_max, вот кодовый модуль моего класса:
Код

#include "basiclist.h"
//------------------------------------------------------------------------------
template<class DataType>
__fastcall TBasicList<DataType>::TBasicList()
{
 FOnAdd=FOnDelete=0;
 FOnAdded=FOnDeleted=0;
}
//------------------------------------------------------------------------------
template<class DataType>
__fastcall TBasicList<DataType>::TBasicList(const TBasicList &bl)
{
 *this=bl;
}
//------------------------------------------------------------------------------
template<class DataType>
DataType __fastcall TBasicList<DataType>::GetItem(unsigned index)
{
 return list[index];
}
//------------------------------------------------------------------------------
template<class DataType>
void __fastcall TBasicList<DataType>::SetItem(unsigned index, DataType val)
{
 list[index]=val;
}
//------------------------------------------------------------------------------
template<class DataType>
unsigned __fastcall TBasicList<DataType>::GetCount()
{
 return list.size();
}
//------------------------------------------------------------------------------
template<class DataType>
TBasicList<DataType>& __fastcall TBasicList<DataType>::operator=(const TBasicList &bl)
{
 FOnAdd=bl.FOnAdd;
 FOnDelete=bl.FOnDelete;
 FOnAdded=bl.FOnAdded;
 FOnDeleted=bl.FOnDeleted;
 Clear();
 for(TLIST::iterator vi=bl.list.begin(); vi<bl.list.end(); vi++)
   Add(*vi);
}
//------------------------------------------------------------------------------
template<class DataType>
void __fastcall TBasicList<DataType>::Add(DataType val)
{
 if(FOnAdd)
 {
   bool can=1;
   FOnAdd(this,-1,&val,can);
   if(!can)return;
 }
 list.push_back(val);
 if(FOnAdded)FOnAdded(this,-1,&val);
}
//------------------------------------------------------------------------------
template<class DataType>
void __fastcall TBasicList<DataType>::Insert(unsigned index,DataType val)
{
 if(FOnAdd)
 {
   bool can=1;
   FOnAdd(this,index,&val,can);
   if(!can)return;
 }
 TLIST::iterator vi=list.begin()+index;
 list.insert(vi,val);
 if(FOnAdded)FOnAdded(this,index,&val);
}
//------------------------------------------------------------------------------
template<class DataType>
void __fastcall TBasicList<DataType>::Del(unsigned index)
{
 if(FOnDelete)
 {
   bool can=1;
   FOnDelete(this,index,&val,can);
   if(!can)return;
 }
 TLIST::iterator vi=list.begin()+index;
 list.erase(vi,val);
 if(FOnDeleted)FOnDeleted(this,index,0);
}
//------------------------------------------------------------------------------
template<class DataType>
void __fastcall TBasicList<DataType>::Clear()
{
 if(FOnDelete)
 {
   bool can=1;
   FOnDelete(this,-1,0,can);
   if(!can)return;
 }
 list.clear();
 if(FOnDeleted)FOnDeleted(this,-1,0);
}
//------------------------------------------------------------------------------
template<class DataType>
__fastcall TBasicList<DataType>::~TBasicList()
{
 list.clear();
}

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

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



livo, шаблоны делаются только в хедерах - компилятор должен всегда видеть его реализацию!


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
livo
Дата 6.8.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



SenkraD, а разве я не реализовал TBasicList в кодовом модуле? И этот модуль подключен к проекту. Или же Вы в понятие "реализации класса" вкладываете иной смысл.
PM MAIL   Вверх
azesmcar
Дата 6.8.2010, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(livo @  6.8.2010,  12:31 Найти цитируемый пост)
а разве я не реализовал TBasicList в кодовом модуле? 

Цитата(SenkraD @  6.8.2010,  09:08 Найти цитируемый пост)
шаблоны делаются только в хедерах 

что именно не понятно? Пиши код в заголовочном файле. За подробностями - в поиск, тут этот вопрос каждые 4 часа всплывает.

Это сообщение отредактировал(а) azesmcar - 6.8.2010, 12:37
PM   Вверх
livo
Дата 6.8.2010, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Разместил реализацию в заголовочном файле. Вот результат:

[C++ Fatal Error] basiclist.h(40): F1001 Internal code generator error

PM MAIL   Вверх
Dem_max
Дата 6.8.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



да почитай еще тут шаблонные классы


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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