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

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

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

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

21.04.2009, 18:02. Просмотров 481. Ответов 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++
или так и собираются строго придерживаться тому, что есть - писать уже с имеющегося кучу кода вместо того, чтобы сделать это встроенным?

Непонятные символы - C++
В общем, сделал функцию.Все работает, но есть одно но: если вводить строку, а введеный символ разделитель будет в ней отсутствовать, то в...

Непонятные ошибки - C++
Пытаюсь скомпилировать код, а компилятор мне ошибки под ребро суёт. Как исправить ошибки? Вот пример №1: *.cpp #include &quot;strf.h&quot; ...

Непонятные знаки - C++
Обьясните пожалуйста, что значит *char (char - любая переменная). Очень часто вижу в разных кодах.

Непонятные ошибки - C++
Доброго времени суток, при вводе данных программа начинает работать не исправно, помогите исправить ошибки. #include &lt;stdio.h&gt; #include...

Непонятные 2 функции - C++
Что за функции cin.clear(); и cin.ignore(256, '\n'); void Matrix::ChangeOneElement() { int i=_M, j=_N; ...

Непонятные функции! - C++
Прошу помочь прокомментировать прогу на массивы, в коде написано где непонятно #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

непонятные ошибки - 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     Непонятные шаблоны, в библиотечку не собираются.
Ответ Создать тему
Опции темы

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