![]() |
Модераторы: 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 файл компилятор игнорирует и не компилирует. |
||||||
|
|||||||
Brodyaga |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Только если эту фразу рассматривать отдельно то может быть, но так как она была в общем разговоре, то ответ на эту фразу отдельно не имеет никакого значения. Фраза имеет смысл только со всеми предыдущими фразами.
Повторю вопрос... Про расширение КАКОГО ИМЕННО файла вы говорите поясняйте пожалуйста?
я всё ПРЕКРАСНО понимаю. Объясните что конкретно вы предлагаете сделать и понятнее.(Если есть предложения кроме как размещать всё в h файле). Под ПОНЯТНЕЕ я имею ввиду привести ИМЯ файла в котором нужно поменять расширение или инклуд(если второе, то на какой инклуд). |
||||||
|
|||||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Совершенно неохота спорить. Твое желание правильно реализуется с помощью экспорта шаблонов, о котором я и написал. Не нравиться ответ - игнорируй. В мои обязанности не входит предоставление 100% точной информации. Отвечаю насколько позволяет время по собственному желанию.
про расширение myclass.cpp, cpp файла который ты инклудишь и компилируешь.
![]() 1. Я предлагаю писать шаблонные функции в заголовочном файле (это я рекомендую, это не криво. Так написан весь STL) 2. Если не хочешь - я предлагаю сменить расширение своего файла (myclass.cpp) на myclass.h например или убери его из проекта вообще, чтобы не компилировался. (правый клик мышки на файле в solution explorer, rename/delete). |
||||
|
|||||
Brodyaga |
|
||||||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
дык какой мне смысл от ответа на одну фразу из всего разговора, которая сама по себе отдельно для меня не интересна?
я и не говорю что ты обязан. Ладно.. замяли, действительно бесполезный спор.
вот теперь ясно что про myclass а не myclassinst.
Сейчас , после того как пояснил нормально всё понятно. Итоги:
Этот вариант рабочий, но мне почему то не нравится. Ессно я сделаю так если по другому не получится.
Если ты имеешь ввиду в файле myclassinst сменить инклуд myclass.cpp на myclass.h, то я говорю, что так работать не будет. Студия ругается на то что шаблон явно не инстанцирован.
Так работает тоже. но так уж точно както криво. А как вы относитесь к варианту добавить строки template ClassA* MyClass::MyFunc<ClassA>(ClassA* object); template ClassB* MyClass::MyFunc<ClassB>(ClassB* object); в файл myclass.cpp ? |
||||||||||||||
|
|||||||||||||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Очень зря, это вполне нормально. Не совсем понял о чем речь. Конечно криво. Смотри. Что делает include? ничего особенного, просто берет содержимое одного файла и копирует в другой (грубо говоря). Т.е. вместо #include "myclass.cpp" у тебя будет содержимое файла myclass.cpp и дальше какие-то строки, не важно. Что у тебя в файле myclass.cpp?
остальное не важно. Получается что компилятор компилирует два файла myclass.cpp и myclassinst.cpp в обоих из них во время компиляции (поскольку include препроцессорная директива, она работает до компиляции) будет ДВА тела конструктора и деструктора. Для компилятора это не проблема, потому как он компилирует каждый cpp файл по отдельности и делает из них obj файлы. А потом наступает очередь линкера, он соединяет эти два obj файла и видет в обоих из них тело конструктора и деструктора того же класса. Потому и ошибка "already defined". Это о причине возникновения ошибки. Теперь о решении Если писать объявление в заголовочном файле а тело в cpp - это нормально, но в случае с шаблонным классом или функциями этого сделать не получиться (как я уже сказал, экспорт шаблонов). А делать include cpp файл неправильно. Если хочешь просто разделить их, сделай два .h файла. myclass.h и myclass_impl.h и включай у себя в программе только myclass_impl.h (который в свою очередь включает myclass.h. Так ты просто разделишь их на два файла. Вот так. Это сообщение отредактировал(а) azesmcar - 28.7.2009, 12:45 |
||||
|
|||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Brodyaga, вот небольшой пример.
Вывод:
Подсказка: функции линкуются динамически, аргумент по умолчанию статически. Если подсказка не объясняет почему так происходит, значит надо уделить немного внимания линковке Судя по Вашим топикам, Вы очевидно не знаете что такое ODR - One Definition Rule (Правило Одного Определения) -------------------- вопросов больше чем ответов |
||||
|
|||||
Brodyaga |
|
||||||||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
ну если ты предлагаешь файл myclassinst.cpp сделать таким:
то так работать не будет.
Это я уже понял после поста UnrealMan'а ![]()
в случае с шаблонным классом получается как раз таки через способ что я приводил в каком то из предыдущих постов.
Вот гдето я видел что так делается, поэтому и так сделал у себя... К сожаление не смог сейчас найти где это видел.. так что соглашусь. А как всё-таки вам способ с включением строк
в файл myclass.cpp ? |
||||||||||||||||
|
|||||||||||||||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Я этого не предлагал. Я только две вещи предложил, оба с этим не имеют ничего общего.
нет, мы говорим о разных вещах. Почитай о translation юнитах.
Ну мало ли кто как пишет. Всего повторять не надо, даже микрософтовские заголовки и функции зачастую не пример для подражания. Хочешь пример качественного кода? Смотри boost ![]() Я только ЗА 1-ый вариант, включить все в заголовочный файл. Ну или хотя бы вот этот |
||||
|
|||||
Brodyaga |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
ну вот же я указывал... myclass.h
myclass.cpp
myclassinst.cpp
Шаблонный класс разнесён на определение и реализацию. и явное инстанцирование применяю и всё работает! Зачем тогда вообще явное инстанцирование нужно, если вы говорите, что надо просто тупо помещать всё в h файл и всё ок без него работает!??! |
||||||||
|
|||||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
В C++ есть много чего, что не используется на практике. Хотя бы потому, что надобности нет. Ну вот объясни мне, зачем в твоем случае это нужно? Что это тебе дает кроме проблем? (проблема в том, что вместо того чтобы дописать код, ты целый день это обсуждаешь..ну чем не проблема?). Тебе обязательно надо использовать все возможности, которые дает C++ в одной своей программе? Скажи мне о преимуществах твоего варианта по отношению к моему (как ты выразился: тупо поместить все в .h файле). Это сообщение отредактировал(а) azesmcar - 28.7.2009, 15:12 |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Это абсолютно тоже самое, что полностью перенести весь файл myclass.cpp в myclass.h и сделать #include "myclass.h" Brodyaga, почитай про раздельную компиляцию, дело говорю. ![]() Какая здесь связь, между явным инстанцированием и вынесением реализации шаблонов в отдельный модуль (которая почти ничем не поддерживается)??? Зачем вообще применять явное инстанцирование без насущной необходимости??? Это сообщение отредактировал(а) Леопольд - 28.7.2009, 17:55 -------------------- вопросов больше чем ответов |
|||
|
||||
Леопольд |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Brodyaga, сможешь объяснить почему foo<int>() выводит 0, а foo<char>() выводит 1?
first.h
main.cpp
first.cpp
Это сообщение отредактировал(а) Леопольд - 28.7.2009, 18:11 -------------------- вопросов больше чем ответов |
||||||
|
|||||||
Brodyaga |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Этот код я всеровно сейчас не пишу, другим пока занимаюсь. Поэтому можно и пообсуждать ![]()
Ну положено же разносить определение и реализацию в разные файлы. В моём случае так и получается. А то както некрасивше, когда некоторые классы разнесены, а не которые нет...
Конкретно между ними - никакой. Просто я хочу и то и то сделать. Я не говорю что явное инстанцирование это обязательно разнесение! Я говорю что с помощью него можно сказать компилятору какое воплощение будет у шаблона, если шаблон разнесён по файлам, так как если шаблон в одном файле, то не надо говорить компилятору какое воплощение будет. |
||||||
|
|||||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Кто это так положил? Для шаблонных функций и классов так не положено, я об этом твержу 2 страницы. Посмотри как сделан boost, STL. Не положено так. Но раз тебя это так заботит, скажи мне зачем так положено? Почему лучше разносить определение и реализацию в разные файлы? Что это дает и почему так рекомендуется?
Не вижу ничего некрасивого. |
||||
|
|||||
Леопольд |
|
||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Brodyaga, это не так. Дело не в том что положено, а в том как тебе нужно. Следующий пример содержит ошибки, потому-что static функции линкуются статически - на этапе компиляции (однако, это не относится к static методам (функциям) класса). Функции с квалификатором inline - вообще отдельная тема. Если же убрать вызовы foo1 и foo2 из main, то всё будет работать. Что бы узнать почему так, читай про раздельную компиляцию. header.h
second.cpp
first.cpp
Заметил, что ты всё же мельком просматриваешь мои посты. Рекомендую уделить им чуть больше внимания. Добавлено через 13 минут и 50 секунд
![]() Может всё же сначала ознакомишься с вопросом, прежде чем пытаться что-то делать? Это будет гораздо быстрее, чем "медотом тыка". Реализацию функций выносят в отдельный cpp файл отнюдь не ради красоты, а для РАЗДЕЛЬНОЙ КОМПИЛЯЦИИ. Насколько мне известно, к шаблонам это относиться в той же степени. Это сообщение отредактировал(а) Леопольд - 29.7.2009, 10:16 -------------------- вопросов больше чем ответов |
||||||||||
|
|||||||||||
Brodyaga |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
РАЗДЕЛЬНАЯ КОМПИЛЯЦИЯ ФОРЕВЕР! Все дружно начинаем молиться на неё!!! ![]()
а я не понимаю к чему столько флуда про раздельную компиляцию и какие то непонятные вопросы мне о ней. Если чтото конкретно хочешь по моему примеру сказать, то скажи.
Чтобы подключать определения определённых классов в местах где они нужны и чтобы вместе с ними не подключалась каждый раз вся реализация. Или если изменится чтото только в реализации, то придётся перекомпилировать и слинковать только её. Ну вообщем.. раздельная компиляция (Леопольд! ВНИМАНИЕ! ![]()
Ну хорошо... а чем не нравится метод включения строк template ClassA* MyClass::MyFunc<ClassA>(ClassA* object); template ClassB* MyClass::MyFunc<ClassB>(ClassB* object); в файл myclass.cpp ? Это сообщение отредактировал(а) Brodyaga - 29.7.2009, 14:56 |
||||||||
|
|||||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Да (можно еще найти причины, но этой достаточно), а теперь смотри, добиться того, что ты описал в случае с шаблонами можно ТОЛЬКО ИСПОЛЬЗОВАВ ЭКСПОРТ ШАБЛОНОВ. Так зачем мучиться если все равно цель недостижима? Включив CPP файл инклудом ты желаемого не получишь все равно. Потому я и говорю, пиши в заголовочном файле.
Понимаешь, не нужна причина чтобы чего-то не делать, нужна причина чтобы делать. Назови мне причину, ты выполняешь определенные действия, для чего? что ты получаешь от этого? Затрудняешь чтение и сопровождение своей программы. Что ты получаешь взамен? Если назовешь себе хоть одну весомую причину - делай так. ![]() Это сообщение отредактировал(а) azesmcar - 29.7.2009, 15:39 |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Brodyaga, Если кого-то цитируете, выделяйте текст, и нажимайте кнопочку "Быстрая цитата". Так как не понятно кого вы цитируете.
п.с. Ощущение, что Brodyaga не способ решения ищет, а способ все усложнить. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
Brodyaga |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Ну как же... Шаблон будет разделён на два файла h и cpp. где надо там я буду подкючать h файл. И не будет никакого инклуда cpp файла. Тоесть всё как я и хотел но без файла myclassinst.cpp
![]() Это сообщение отредактировал(а) Brodyaga - 29.7.2009, 18:24 |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Да, это вариант..и ты даже получишь желаемое, но за счет чего? Теперь каждый раз когда тебе нужно использовать шаблон для нового типа, придется лезть в файл и добавлять строку, а если ты хочешь использовать свой шаблон для типа, который не известен твоему cpp файлу? Дополнительно делать в него include. Так твой cpp файл скоро разрастется, а что если завтра ты решишь что твой шаблонный класс это шедевр созданный твоими собственными руками и ты решишь увековечить его в виде lib-ы. Как потом пользователи твоей библитеки будут использовать твой шаблонный класс со своими типами? Тут теряется мощь шаблонов в некотором смысле. Если это устраивает - пиши. |
|||
|
||||
Леопольд |
|
||||||||||||||||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Судя по всему, этим твои знания о раздельной компиляции и ограничиваются . Это тоже самое, что сказать - "С++ это язык программирования, и он нужен для того чтобы писать на нём программы". Но если это всё что человек знает про С++, то программистом его назвать нельзя, не так ли? Мои вопросы тебе непонятны именно потому что ты не знаешь как именно работает раздельная компиляция, в том числе и с шаблонами. Я советую тебе, изучить этот вопрос, потому что если бы ты знал его, то не начал бы этот топик вообще ![]() Вот ещё один "непонятный" примерчик того что ты не знаешь как работает линковка. Я предполагаю что ты не знаешь этого потому что ты ни на один "непонятный" вопрос до сих пор не ответил ничего вразумительного: Почему не компилируется вот это? header.h
first.cpp
second.cpp
А вот это, почти тоже самое, компилируется без проблем. header.h
first.cpp
second.cpp
А вот это, тоже не компилируется header.h
first.cpp
second.cpp
Добавлено @ 21:12
Этого вообще никогда не должно быть. Для этого есть *.h или, частенько, в случае с шаблонами, *.hpp Это сообщение отредактировал(а) Леопольд - 29.7.2009, 21:16 -------------------- вопросов больше чем ответов |
||||||||||||||||||||||||
|
|||||||||||||||||||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
шаблоны тут не при чем ![]() си - *.c и *.h cpp - *.cpp *.hpp (ну а *.h им достались по наследству ![]() |
|||
|
||||
Brodyaga |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
Это что экзамен чтоли? я тебе должен сейчас всё рассказать, что знаю про раздельную компиляцию?
И не собираюсь отвечать. Даже читать твои этажи кода не хочу. Я тебе не собираюсь ничего доказывать о своих знаниях. Если хочешь обсудить раздельную компиляцию, создай отдельную тему.
Можно эти строки вынести в отдельный h. Ну вообщем-то я тебя понял, спасибо! Буду выбирать, что для меня лучше. +1! ;) |
||||||
|
|||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Эти "этажи" настолько элементарны, что не заслужили такого названия ![]() Это сообщение отредактировал(а) Леопольд - 30.7.2009, 09:49 -------------------- вопросов больше чем ответов |
|||
|
||||
Brodyaga |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 599 Регистрация: 19.1.2008 Репутация: нет Всего: 2 |
И у меня не возникают. Всё прекрасно компилируется. Просто возник небольшой казус с шаблонами, так как определялись повторно конструктор и деструктор. А так всё норм, выслушал плюсы и минусы явного инстанцирования и полного включения. Далее обсуждать чтото в этой теме не намерен.
Если тебе хочется показать всем насколько ты круто знаешь линковку, то для этого не нужно флудить о ней в этой теме и задавать мне вопросы. Просто напиши статейку и выложи её здесь. Думаю это на самом деле будет полезно, без шуток. |
||||
|
|||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Мне так показалось из твоих постов, но я не уверен в этом. Возможно, ты просто очень сильно не любишь отвечать на вопросы. Я не бахвалился... ![]() ![]() Добавлено через 7 минут и 6 секунд
Дело в том, что я вижу непосредвенную связь между, линковкой и инстанцирванием шаблонов. Я задавал наводящие вопросы, но увы, всё зря... Добавлено через 10 минут и 9 секунд По шаблонам есть неплохая книга - "Шаблоны С++. Справочник разработчика". Местами тяжеловато написанно, но там раскрыто много вопросов. Это сообщение отредактировал(а) Леопольд - 30.7.2009, 12:18 -------------------- вопросов больше чем ответов |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Я заметил, случайно (если мне вообще не показалось) что кое-кто в *.h держит всякие разные объявления + реализации inline функций (глобальные переменные не рассматриваю), соответственно в *.сpp определения не inline фукнций. static функции могут быть определенны в хидере только если это не члены класса (inline static тоже можно определить в хидере, в том числе, если функция - член класса) В *.hpp шаблоны - реализация которых, как правило, находится там же, независимо от линковки. Мне это показалось удобным, и я делаю именно так ![]() Это сообщение отредактировал(а) Леопольд - 30.7.2009, 15:48 -------------------- вопросов больше чем ответов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |