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

 
Шаблоны?
gvg
Отправлено: 27.10.2005, 09:30


Машинист паровоза

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



Имею библиотеку
CODE

// header file myclass.h
//-----------------------
template <class T>
class MyClass
{
private:
std::vector list;
protected:
virtual void Grow();
public:
T operator[]( int pos )const;
void Add( T Item );
int IndexOf( const T Item );
int Count() { return list.size(); }
// и еще инлайн-методы
};

//======================
// myclass.cpp
//----------------------
#include "myclass.h"

template <class T>
void MyClass<T>::Add( T Item )
{
// ...
// реализация
// ...
}

template <class T>
void MyClass<T>::Grow()
{
// ...
// реализация
// ...
}

template <class T>
int MyClass<T>::IndexOf( const T Item )
{
int ret = 0;
// ...
// реализация
// ...
return( ret );
}

Программа
CODE

#include <myclass.h>
...
MyClass<int> sl;
Memo1->Lines->Add( sl.Count());
sl.Add( 1 );
sl.Add( 2 );
Memo1->Lines->Add( sl[0] );
Memo1->Lines->Add( sl[1] );
Memo1->Lines->Add( sl.IndexOf( 1 ));
...

Ошибки
CODE

[Linker Error] Unresolved external 'MyClass<int>::Grow()' referenced from ...
[Linker Error] Unresolved external 'MyClass<int>::Add(int)' referenced from ...

Аналогично на функцию IndexOf. Библиотека подключена. На инлайновую Count не ругается. В чем может быть причина?


Отредактировано gvg — 27/10/2005, 09:39
Asher
Отправлено: 27.10.2005, 10:25


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

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



Привет.
Реализация шаблонов не поддерживает разделение на *.h и *.cpp
Пиши все в хедере
gvg
Отправлено: 27.10.2005, 10:32


Машинист паровоза

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



Странно... В стародавние времена писал аналогично под ДОС на Watcom С — делил на h и с, все было нормально... Или это Borland C++ такой?
Asher
Отправлено: 27.10.2005, 11:29


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

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



Не знаю как в Watcom, а в VC6 и VC7 так-же, как и в Builder'е
Георгий
Отправлено: 28.10.2005, 00:04


Почетный железнодорожник

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



QUOTE (gvg @ 27/10/2005, 11:32)
Странно... В стародавние времена писал аналогично под ДОС на Watcom С — делил на h и с, все было нормально... Или это Borland C++ такой?

проверил в watcom c 10.6 — не работает говорит тоже самое, что и BC++
** kea
Отправлено: 01.11.2005, 17:38


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







Здравствуйте!
При написании собственного шаблонного класса разделял на *.h и *.cpp. При исползовании этого класса в проекте поключал *.cpp, программа слинковалось.
Георгий
Отправлено: 01.11.2005, 21:42


Почетный железнодорожник

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



QUOTE (** kea @ 01/11/2005, 18:38)
Здравствуйте!
При написании собственного шаблонного класса разделял на *.h и *.cpp. При исползовании этого класса в проекте поключал *.cpp, программа слинковалось.

код в студию
Asher
Отправлено: 02.11.2005, 09:25


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

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



QUOTE
При написании собственного шаблонного класса разделял на *.h и *.cpp. При исползовании этого класса в проекте поключал *.cpp, программа слинковалось.

Естественно. Вы же *.cpp подключили. а в него *.h включен.
Просто при таком раскладе это разбиение не имеет смысла.
AVC
Отправлено: 02.11.2005, 09:54


Ветеран

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



QUOTE

Естественно. Вы же *.cpp подключили. а в него *.h включен.

Когда-то давно, при слабых редакторах, приходилось таким образом разбивать код на серию #include "?.c."
gvg
Отправлено: 02.11.2005, 10:25


Машинист паровоза

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



В английском не слишком силен, может кто пояснит. Что означает ключ Proect Options -> C++ -> Templates ->External ?
** kea
Отправлено: 02.11.2005, 17:22


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







Здравствуйте!
Почему же при включении *.cpp разбиение не имеет смысла? Это плохой стиль программирования?
Ведь сохраняется удобство редактирования файла, когда хедеры и код помещаются отдельно.
gvg
Отправлено: 02.11.2005, 17:33


Машинист паровоза

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



Если включение через #include "*.cpp" то какой-же тут смысл?
kea
Отправлено: 03.11.2005, 17:35


Станционный диспетчер

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



2gvg: Почему нет смысла?

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