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

 
Шаблоны в BCB, Проблема с компоновкой шаблона
Ламер (редкий)
Отправлено: 05.02.2004, 17:38


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







Заголовок выглядит вот так:

#ifndef __MATRIX_H
#define __MATRIX_H

template class TMatrix
{
protected:

TYPE **matrix;
int cols;
int rows;

public:

void SetCell(TYPE Value, int Col,int Row);

TYPE GetCell(int Col,int Row);

int GetRowCount();

int GetColCount();

virtual void SetDimension(int ColCount,int RowCount);

virtual void ResetDimension(int AddCol,int AddRow, bool Preserve=true);

public:

TMatrix(int ColCount,int RowCount);

TMatrix();

~TMatrix();
};

#endif

Реализацию приводить не буду, скажу лишь, что с компиляцией модуля
проблем не возникло.

А теперь вот тестовое приложение:
#include
#include "Matrix.h"
#pragma hdrstop

#include "UMatrixTest.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMatrix Matrix(StrToInt(Edit1->Text),StrToInt(Edit2->Text));

for(int i=0;iText);i++)
{
for(int j=0;jText);j++)
{
Matrix.SetCell(StrToFloat(Edit3->Text),i,j);
}
}
int x=4*Matrix.GetCell(StrToInt(Edit1->Text)-2,StrToInt(Edit2->Text)-1);
ShowMessage(StrToInt(x));
}

Компиляция прошла успешно, а вот компоновщик обругал по полной
программе:
[Linker Error] Unresolved external 'TMatrix::~TMatrix()' referenced from C:\PROJECTS\MATRIXTEST\UMATRIXTEST.OBJ
... и далее в таком же духе.
Так как с английским у меня, скажем так, туговато, не понял ни черта.

Господа програмеры, если кто знает, чего линкеру не нравится, поделитесь вашим мнением. Заранее благодарен....
Beast
Отправлено: 05.02.2004, 17:49


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







По-моему ваш код должен выглядеть вот так:

TMatrix Matrix(StrToInt(Edit1->Text),StrToInt(Edit2->Text));

for(int i=0;iText);i++)
{
for(int j=0;jText);j++)
{
Matrix.SetCell(StrToFloat(Edit3->Text),i,j);
}
}
int x=4*Matrix.GetCell(StrToInt(Edit1->Text)-2,StrToInt(Edit2->Text)-1);
ShowMessage(IntToStr(x));

странно как это компилятор вас не обругал
Valdemar
Отправлено: 06.02.2004, 08:52


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

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



А у вас реализация шаблона где находится? Она должна быть в h-файле.
Asher
Отправлено: 06.02.2004, 10:17


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

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



Здарвствуйте.

Хотя по стандарту и можно разделять шаблоны на .h и .cpp файлы (см. Страуструпа Глава 13.7 (спец. издание)), но в реальности компиляторы (в силу каких-то своих внутренних причин biggrin.gif ) это не поддерживают. Во всяком случае Builder 5 и MS VC++ 6.
так что как написал Valdemar придется отказаться от .cpp и весь код, вместе с реализацией, поместить в .h .
Ламер (редкий)
Отправлено: 06.02.2004, 10:33


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







Благодарю за сотрудничество

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