Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
mmasm
Сообщений: n/a
#1

Непонятные шаблоны, в библиотечку не собираются. - C++

21.04.2009, 18:02. Просмотров 475. Ответов 3
Метки нет (Все метки)

Вопрос: stlport и иже с ними оформлены как библиотеки (lib, so, dll). При объявлениии шаблонов, таких, в программе нет ругани компилятора, все хорошо линкуется и работает. Сам пытаюсь скомпоновать 1 шаблон в библиотеку (для программы нужно, 2 десятка массивов) и не выходит ничего. Линкер Visual C (версия 8-я) ругатся начинает на неопределенные символы внутри библиотеки mytlpl.lib ниже, укороченая версия кода.

mytpl.h

template <class T>
class Test {
private:
T * addr;
Test() : addr(NULL) {};
~Test() {};

virtual void Boo(T * inp);
};

mytpl.cpp

template <class T> void Test<T>::Boo(T * inp) {
addr = inp;
}

компилируется в mytpl.lib

основная программа:
// main.cpp
...
#include "mytpl.h"
#pragma comment(lib, "mytpl.lib")

Test<int> test;
int i;

int main() {

test.Boo(&i);

}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2009, 18:02     Непонятные шаблоны, в библиотечку не собираются.
Посмотрите здесь:

C++ непонятные ошибки
Непонятные 2 функции C++
Синтаксис- непонятные знаки C++
C++ Непонятные ошибки
C++ Непонятные знаки
C++ Непонятные ошибки компиляции!!!!
C++ Непонятные функции!
C++ Непонятные данные на выходе
Непонятные ошибки C++
C++ Непонятные символы
C++ Непонятные ошибки линковщика
Непонятные символы в консоли C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
21.04.2009, 18:11     Непонятные шаблоны, в библиотечку не собираются. #2
Может не стоит реализацию функций-членов шаблонного класса в отдельный файл выносить.
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
21.04.2009, 18:12     Непонятные шаблоны, в библиотечку не собираются. #3
Помоему компилятор не видит .cpp
mmasm
Сообщений: n/a
21.04.2009, 18:37     Непонятные шаблоны, в библиотечку не собираются. #4
Хм... Я смотрел исходники stlport: vector.h vector.c там все по разным файлам, тут какая-то беда именно с линковкой. А проблема в том, что шаблон использоватся должен в библиотеке, которая линкуется к основному файлу... ммм.. т.е. он нужен и основной прграмме и библиотеке. Да, и просто интересно стало, как-это stl-port собрали, а тут такая фигня непонятная творится...

Смысл в том, что если объявить:
typedef struct {
..
..
} mytyp;

и сделать
vector<mytyp *> mytyp_vector;
это работает, а в моем случае не прокатывает.

а вот если в mytpl.cpp добавить строчку
Test<int *> __tmp_declaration;
то можно в программе смело делать такое объявление и все нормально слинкуется, однако для каждого и любого(темболее) типа я такое предусматривать-же не буду )

Вот оригинальная ругонь линкера
Код
------ Build started: Project: test002, Configuration: Debug Win32 ------
Linking...
main.obj : error LNK2001: unresolved external symbol "public: virtual int * __thiscall ObjectBuffer<int>::GetObjectW(void)" (?GetObjectW@?$ObjectBuffer@H@@UAEPAHXZ)
main.obj : error LNK2001: unresolved external symbol "public: virtual unsigned long __thiscall ObjectBuffer<int>::InsertAt(unsigned long,int *)" (?InsertAt@?$ObjectBuffer@H@@UAEKKPAH@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual unsigned long __thiscall ObjectBuffer<int>::AddObject(int *)" (?AddObject@?$ObjectBuffer@H@@UAEKPAH@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall ObjectBuffer<int>::DeleteObject(unsigned long)" (?DeleteObject@?$ObjectBuffer@H@@UAEXK@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall ObjectBuffer<int>::DeleteObject(int *)" (?DeleteObject@?$ObjectBuffer@H@@UAEXPAH@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual unsigned long __thiscall ObjectBuffer<int>::GetObjectIdxByAddr(int *)" (?GetObjectIdxByAddr@?$ObjectBuffer@H@@UAEKPAH@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual unsigned long __thiscall ObjectBuffer<int>::GetObjectIdxByID(unsigned long)" (?GetObjectIdxByID@?$ObjectBuffer@H@@UAEKK@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall ObjectBuffer<int>::MoveUp(int *)" (?MoveUp@?$ObjectBuffer@H@@UAEXPAH@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall ObjectBuffer<int>::MoveUp(unsigned long)" (?MoveUp@?$ObjectBuffer@H@@UAEXK@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall ObjectBuffer<int>::MoveDown(int *)" (?MoveDown@?$ObjectBuffer@H@@UAEXPAH@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall ObjectBuffer<int>::MoveDown(unsigned long)" (?MoveDown@?$ObjectBuffer@H@@UAEXK@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall ObjectBuffer<int>::MoveTop(int *)" (?MoveTop@?$ObjectBuffer@H@@UAEXPAH@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall ObjectBuffer<int>::MoveTop(unsigned long)" (?MoveTop@?$ObjectBuffer@H@@UAEXK@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall ObjectBuffer<int>::MoveBottom(int *)" (?MoveBottom@?$ObjectBuffer@H@@UAEXPAH@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall ObjectBuffer<int>::MoveBottom(unsigned long)" (?MoveBottom@?$ObjectBuffer@H@@UAEXK@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual int * __thiscall ObjectBuffer<int>::operator[](unsigned long)" (??A?$ObjectBuffer@H@@UAEPAHK@Z)
C:\src\test002\Debug\test002.exe : fatal error LNK1120: 16 unresolved externals
Build log was saved at "file://c:\src\test002\test002\Debug\BuildLog.htm"
test002 - 17 error(s), 0 warning(s)
Добавлено через 3 минуты 55 секунд
Цитата Сообщение от oxotnik Посмотреть сообщение
Помоему компилятор не видит .cpp
===
определение и реализация шаблонов должны находится в одном месте
Хм, а как тогда такое разделение идет в stl-port к примеру?

и, кстати говоря уже пробовол запихивать реализацию в *.h файл, кроме кучи варнингов ничего не вышло

Добавлено через 10 минут 49 секунд
Сорри за беспокойство, нашел ответ у С. Прата "Язык программирования Си++", если есть реализация export в компиляторе, то можно разделять определение класса и реализацию методов по разным файлам.

пр:

export template <class T> void Test<T>::Boo(T * inp) {
addr=inp;
}

Добавлено через 3 минуты 18 секунд
Жаль только в VC8 оно не работает Значит, 2 разных файла тупо сольем методом #include <>.

Всем спасибо, все понятно.
Yandex
Объявления
21.04.2009, 18:37     Непонятные шаблоны, в библиотечку не собираются.
Ответ Создать тему
Опции темы

Текущее время: 07:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru