![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Brodyaga |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Всей здравствуйте! Хочу сделать у класса одну шаблонную функцию. Делаю так
myclass.h
myclass.cpp
myclassinst.cpp
На всё это дело студия ругается так:
и т.д. может кто подскажет, что я делаю неправильно? P.S. MSVC 2005 Это сообщение отредактировал(а) Brodyaga - 27.7.2009, 18:46 |
||||||||
|
|||||||||
triclosan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 1 Всего: 12 |
попробуй не разносить определение и реализацию в разные файлы
|
|||
|
||||
Brodyaga |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Пробовал уже.. так работает.. Но ведь явное воплощение и нужно для того, чтобы работало всё с разносом определения и реализации в разные файлы. Поэтому мне интересно как всётаки так сделать!? |
|||
|
||||
vinick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 3 Всего: 22 |
Вынести реализацию шаблонов в cpp-файл так как ты хочешь можно только при помощи ключевого слова export, которое поддерживают только Comeu С++ и Borland C++, а сейчас эту фичу по-моему вобще исключили из стандарта языка. Кстати, зачем понадобилось явное инстанцирование? Я встречал его только в одном старом проекте, где древний gcc не мог сам разобраться с шаблонами и ему приходилось помогать руками. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Экспорт шаблонов 99% компиляторов не поддерживается, пиши реализацию в .h файле. меня опередили Это сообщение отредактировал(а) azesmcar - 27.7.2009, 19:51 |
|||
|
||||
Brodyaga |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Не только... Например если я объявляю весь класс шаблонным, а не только функцию, а в файле myclassinst.cpp делаю так:
то всё ок!
Затем, чтобы линкер не ругался на пустые ссылки оставленные компилятором из-за того, что он не может произвести воплощение шаблона.
Ну студийным ведь поддерживается? значит им както можно сделать? Ведь если делать целый класс шаблонным, то работает же...... |
||||||||
|
|||||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Нет, не поддерживается. Нет, не будет работать, если у тебя что-то работает - покажи, найдем причину, сделаем так что перестанет работать ![]() |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Эх, Brodyaga, не туда ты забрёл
![]() ![]() |
|||
|
||||
Brodyaga |
|
||||||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Нет, работает! myclass.h
myclass.cpp
myclassinst.cpp
вот так, РАБОТАЕТ!
да я пока ещё не вижу к чему можно прислушаться ![]()
Тоесть избежать этого можно только включив строки template ClassA* MyClass::MyFunc<ClassA>(ClassA* object); template ClassB* MyClass::MyFunc<ClassB>(ClassB* object); в myclass.cpp? Я кстати так тоже пробовал и так работает... но хотелось чтобы эти строки в отдельном файле находились... Значит вариант с отдельным файлом(myclassinst.cpp) для этих строк отпадает? только в myclass.cpp!?!? Это сообщение отредактировал(а) Brodyaga - 28.7.2009, 06:55 |
||||||||||||||
|
|||||||||||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
UnrealMan
А причем тут явное инстанцирование? Человек писал что хочет реализовывать и определять в разных файлах, если он инстанцировать хочет, так значит термин не тот подобрал. Лично мне слово "воплощение шаблона" ничего не говорит ![]() Конечно будет работать, какая разница включать cpp файл или header? В итоге это одно и тоже. Если в конечном итоге определение будет включено в cpp файл - будет работать, дели хоть на 100 файлов. UnrealMan прав, тут экспортом шаблонов и не пахнет. Я код не смотрел, прочитал
думал оно и есть. После этой фразы не удивительно что все подумали про экспорт шаблонов. Добавлено @ 07:05 Brodyaga А проблема в том, что ты делаешь include cpp файл и его же скорее всего компилируешь, получаеся два определения конструктора и деструктора, либо пиши все в хидер файле, либо убери свой cpp который инклудишь из проекта, чтоб не компилировался. Это сообщение отредактировал(а) azesmcar - 28.7.2009, 07:09 |
|||
|
||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
А ещё лучше, разберись с линковкой С++. Тебе необходимо понимание как она работает. Надо помнить несколько вещей: что такое "единица трансляции", он же "модуль". Каким образом линковщик работает с разными фукнциями/переменными (static, inline и обычные) когда код оных уже оттранслирован в (разные) модули. Всё это объединаяется под одним термином - "раздельная компиляция". как правило, сколько файлов *.cpp столько и модулей *.obj, не следует делать #include <*.cpp>
Либо переименуй его в *.h ![]() Это сообщение отредактировал(а) Леопольд - 28.7.2009, 08:06 -------------------- вопросов больше чем ответов |
||||
|
|||||
Brodyaga |
|
||||||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
А надо смотреть всё ![]()
Я имел ввиду, что хочу чтобы явное воплощение(инстанцирование) работало и с разносом определения и реализации в разные файлы.. помоему всё было предельно ясно, если читать сначала...
это я знаю...
при моём подходе именно cpp нужно инклудить
Чото мне это как то криво кажется... наверное лучше строки template ClassA* MyClass::MyFunc<ClassA>(ClassA* object); template ClassB* MyClass::MyFunc<ClassB>(ClassB* object); в myclass.cpp перенесу.. |
||||||||||||||
|
|||||||||||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Смотря что делаешь, я на конкретную фразу отвечал а не на вопрос. Код смотреть не было времени и причину ошибки я тоже не называл. То что ты хочешь реализуется методом экспорта шаблонов, а твоя реализация отличается от реализации в заголовочном файле лишь тем, что ты .h заменил на .cpp (по сути файл переименовал) и еще компилируешь его. какая разница? что меняет расширение файла? Это условности. криво это инклудить cpp файл. Избавь себя от проблем, пиши все в заголовочном файле. В этом ничего ненормального нет, посмотри как сделано в STL. Это сообщение отредактировал(а) azesmcar - 28.7.2009, 08:46 |
|||
|
||||
Brodyaga |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
А фраза вытекала из конкретного вопроса, поэтому иговорю что надо всё смотреть ![]()
Про расширение какого именно файла вы говорите поясняйте пожалуйста.
Такая, что если подключать myclass.h файл к файлу myclassinst.cpp, то явное воплощение шаблона не работает.. |
||||||
|
|||||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Без разницы из чего она вытекает, фраза была полной и носила конкретный смысл. В правильно сформулированном виде эта фраза однозначна и не зависит от контекста.
про расширение cpp файла.
Повторяюсь, CPP файл твой компилятор КОМПИЛИРУЕТ, потому при линковке у класса получается два конструктора 1 - в myclass.cpp 2 - в myclassinst.cpp а .h файл компилятор игнорирует и не компилирует. |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |