C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Шаблоны, Раздельная компиляция
RedDevil
Отправлено: 15.11.2005, 00:25


Не зарегистрирован







Помогите, pls! Я написал шаблон класса для динамического массива и сделал раздельную компиляцию(Unit2.cpp и Unit2.h).
Подключаю их к модулю Unit1.h(#include "Unit2.h" и #include "Unit2.cpp") и объявляю объект этого класса TDMassiv A(6)в классе формы TForm1, а Builder мне не разрешает.
Ошибки:[C++Error] Unit1.h(25): E2293 ) Expected и
[C++Error] Unit1.cpp(16): E2451 Undefined symbol 'A'.
Почему? Хотя, если объявить этот объект в ф-ии __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)файла Unit1.cpp, то программа будет работать.
Но тогда нельзя будет использовать этот объект в других ф-иях, как void __fastcall TForm1::Button1Click(TObject *Sender).
Asher
Отправлено: 15.11.2005, 09:58


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Люди! Пользуйтесь поиском. Он определенно рулит.
Шаблоны?
RedDevil
Отправлено: 16.11.2005, 00:38


Ученик-кочегар

Группа: Участник
Сообщений: 4



Спасибо за совет, но я заранее прочитал эти советы, поэтому и написал. Ведь я же подключаю *.cpp-файл, в который *.h-файл уже включен.
Тем более я пробовал писать все в *h.-файле — не получается.
Ошибки:[C++Error] Unit1.h(25): E2293 ) Expected и
[C++Error] Unit1.cpp(16): E2451 Undefined symbol 'A'.
Может быть ошибка где-то в классе:
Unit2.h
CODE

template <typename T>
class TDMassiv
{
private:
  unsigned int FCountItems;
  void __fastcall SetCountItems(unsigned int value);
public:
  __property unsigned int CountItems={read=FCountItems,write=SetCountItems};
  T* Items;
  TDMassiv(int a);
  ~TDMassiv();
  T& TDMassiv::operator[] (unsigned int i);
};
//------------------------------------------------------------
Unit2.cpp

template <typename T>
void __fastcall TDMassiv<T>::SetCountItems(unsigned int value)
{
 if(FCountItems!=value)
 {
    Items=(T*)realloc(Items,value*sizeof(T));
    FCountItems=value;
 }
}
//---------------------------------------------------------------------------
template <typename T>
TDMassiv<T>::TDMassiv(int a)
{
  Items=(T*)calloc(a,sizeof(T));
  FCountItems=a;
}
//---------------------------------------------------------------------------
template <typename T>
TDMassiv<T>::~TDMassiv()
{
  free(Items);
}
//---------------------------------------------------------------------------
template <typename T>
T& TDMassiv<T>::operator[] (unsigned int i)
{
  if(i>=CountItems)
  throw Exception(("Dinamic Massive out of range. Index should be less than "+(AnsiString)CountItems));
  return *(Items+i);
}


Отредактировано Георгий — 16/11/2005, 02:16
Asher
Отправлено: 16.11.2005, 09:05


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Прочел еще раз. cool.gif Теперь внимательно. wink.gif
Указанная проблема не имеет никакого отношения к шаблонам.
Почитайте по области видимости и extern.
Когда указываете ошибки неплохо бы еще в листинге комментарием помечать соответствующую строку.
Номер компилятор Вам говорит.
А при создании неплохо бы указывать тип шабдлона, типа так:
CODE
TDMassiv<int> A(6);
Ну почему никто тэги code не пишет...

Отредактировано Георгий — 16/11/2005, 23:19
RedDevil
Отправлено: 18.11.2005, 00:45


Ученик-кочегар

Группа: Участник
Сообщений: 4



Большое спасибо, Asher! Теперь все ясно.

Вернуться в Вопросы программирования в C++Builder