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: Почему нет смысла? |
|