|
|
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
Народ на так на вскидку может у кого была такая засада. Короче в файле test1.cpp есть класс: Код: plaintext 1. 2. 3. 4. 5. далее я вызываю из файла test2.cpp эту функцию. При линковке получаю: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 16:59 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
Если память мне не изменяет, то в стандарте C++ написано, что могут быть шаблонные классы и шаблонные функции, А шаблонного метода в обычном классе быть не может. Оно и логично, т.к. при использовании шаблонов работает препроцессор, только потом компилятор. В твоем случае препроцессор не обрабатывает "шаблонный метод", поэтому все валится. Причем валится, скорее всего, на этапе линковки, т.к. код оттранслировался нормально (синтаксических ошибок нет), а указатель на необходимую функцию получить не получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 17:26 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
Я тоже сначала так думал, но после того как код откомпилился отбросил эту версию. Хотя твоё предположение все объесняет... Значит все таки нельзя... Ладно, пасиб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 17:33 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
Если память мне не изменяет, то в стандарте C++ написано, что могут быть шаблонные классы и шаблонные функции, А шаблонного метода в обычном классе быть не может. "Класс или шаблон класса может иметь члены, которые сами являются шаблонами. <...> Член шаблон не может быть виртуальным." Б.Стр., C++ 3изд., [13.6.2] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 17:36 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
IlichX86Если память мне не изменяет, то в стандарте C++ написано, что могут быть шаблонные классы и шаблонные функции, А шаблонного метода в обычном классе быть не может вполне может Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Проблемы у автора скорее всего из-за того, что в test2.cpp шаблон просто не виден. Т.к. он должен использоваться в той же единице трансляции, где и объявлен - т.е. либо в том же .cpp файле, либо подключать .h файл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 17:40 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
redskin Проблемы у автора скорее всего из-за того, что в test2.cpp шаблон просто не виден. Т.к. он должен использоваться в той же единице трансляции, где и объявлен - т.е. либо в том же .cpp файле, либо подключать .h файл В том же cpp нет возможности сделать, header я подключаю и похоже видит он его, потому что в противном случае заругался бы что функция не объявлена на этапе конпиляции... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 17:45 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
bemtaill redskin Проблемы у автора скорее всего из-за того, что в test2.cpp шаблон просто не виден. Т.к. он должен использоваться в той же единице трансляции, где и объявлен - т.е. либо в том же .cpp файле, либо подключать .h файл В том же cpp нет возможности сделать, header я подключаю и Если предполагается использовать шаблон в нескольких cpp файлах, то почему не перенести его реализацию в header, как обычно рекомендуют ведущие собаководы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 17:57 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
bemtaill redskin Проблемы у автора скорее всего из-за того, что в test2.cpp шаблон просто не виден. Т.к. он должен использоваться в той же единице трансляции, где и объявлен - т.е. либо в том же .cpp файле, либо подключать .h файл В том же cpp нет возможности сделать, header я подключаю и похоже видит он его, потому что в противном случае заругался бы что функция не объявлена на этапе конпиляции... Шаблонные функции необходимо инстанцировать, а инстанцируются они, когда используются. Если ты будешь использовать функцию с типом int, то компилятор попробует найти ее определение и применить ей этот тип. Так как при компиляции модуля с шаблоном она не использовалась, то все ее определение в сипипишном файле никому оказалось не нужно. Когда же дошло дело до второго модуля, то компилятор увидел объявление, и сказал - гуд, линковщик ее найдет с нужным типом в каком нибудь модуле. Так как он сам от нее отказался при компиляции первого модуля, линковщик ее найти не смог. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 17:58 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
redskin bemtaill redskin Проблемы у автора скорее всего из-за того, что в test2.cpp шаблон просто не виден. Т.к. он должен использоваться в той же единице трансляции, где и объявлен - т.е. либо в том же .cpp файле, либо подключать .h файл В том же cpp нет возможности сделать, header я подключаю и Если предполагается использовать шаблон в нескольких cpp файлах, то почему не перенести его реализацию в header, как обычно рекомендуют ведущие собаководы? Насколько я понимаю, так не только рекомендуют, а делают постоянно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 17:59 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
AkhНасколько я понимаю, так не только рекомендуют, а делают постоянно. Ну можно ради смеха и в каждом .cpp свою реализацию писать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 18:04 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
Спасибо, так и сделаю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 18:09 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
redskin AkhНасколько я понимаю, так не только рекомендуют, а делают постоянно. Ну можно ради смеха и в каждом .cpp свою реализацию писать :) Возникла мысль, как он будет тогда линковать. Немного протестировал, мне показалось, что берет первое попавшееся инстанцирование. Надо будет в понедельник это дело посмотреть получше... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 18:30 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
А почему бы не спрятять реализацию в какой-нибудь cpp и сделать явную инстанциацию метода для всею необходимых типов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 21:08 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
blindedА почему бы не спрятять реализацию в какой-нибудь cpp и сделать явную инстанциацию метода для всею необходимых типов? А как это? Можно поподробнее/примерчик? Не совсем понял, что значит инстанциировать метод для всех необхрдимых типов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2006, 18:27 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
А это очень просто template<> void ToolBox::ShowArrayContent<int>(int); Вот тогда модуле п оявляется код соотвествующей фукции, независимо от того юзаешь ты ее или нет. в твоем случае что происзодит? Компилятор видит декларациб статического матода, но почему-то не видит определения, по-видимому само определение где-то в cpp файле. А поэтому он не делает инстанциации щаблона там, где ты его используещь. Но это не ошибка, потому что стандарт предполагает вот такое ручное управление инстанциацией. а линкер он тупой - вот есть функция, а кода ее нет ну вот тебе и баг. А решения 3 1 вытащить определение в h файл 2 явно инстанциировать 3 достать компилчтор с базой данных щаблонов. например Sun Workshop такое бы сжевал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2006, 21:16 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
blindedА это очень просто template<> void ToolBox::ShowArrayContent<int>(int); Вот тогда модуле п оявляется код соотвествующей фукции, независимо от того юзаешь ты ее или нет. в твоем случае что происзодит? Компилятор видит декларациб статического матода, но почему-то не видит определения, по-видимому само определение где-то в cpp файле. А поэтому он не делает инстанциации щаблона там, где ты его используещь. Но это не ошибка, потому что стандарт предполагает вот такое ручное управление инстанциацией. а линкер он тупой - вот есть функция, а кода ее нет ну вот тебе и баг. А решения 3 1 вытащить определение в h файл 2 явно инстанциировать 3 достать компилчтор с базой данных щаблонов. например Sun Workshop такое бы сжевал Спасибо, буду знать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2006, 21:40 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
blinded Но это не ошибка, потому что стандарт предполагает вот такое ручное управление инстанциацией. а линкер он тупой - вот есть функция, а кода ее нет ну вот тебе и баг. А что говорит стандарт, на счет того, что когда встречаются 2-е инстанциации, то линкер выбирает из них первую попавшуюся, с не ругается, что их две? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2006, 09:56 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
не помню, надо посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2006, 10:23 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
blindedне помню, надо посмотреть. Опять же это для чего-то сделано (как и отмена при наследовании перегруженных функций по умолчанию), просто интересно - зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2006, 10:30 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
полная анархия. стандарт говорит что бывает инстанциация неявная и явная. дальше начинаются изголяшества разработчиков. Ну с явной (explicit) все понятно. А вот с неявной все сложнее, как правило все умеют делать неявную подстановку когда в каждрм объектнике сноя копия кода для инстанциированных в нем методов, они различаются по именам и поэтому при линковке никаких проблем но размео исполняемого модуля "великоват". дальше у кого чего у aCC (HP) есть ключик, когда компилер генерит для каждого объектика свое определения, а потом линкер берет первое попавшееся, правда преимущество имеет явная инстанциация, ежели она есть у SUNWorkshop - ключик для создания БД шаблонов. Он делает временную поддиректорию в которую комнилятор складывает инстанциированные методы, а потом при линкоке их оттуда вытаскивает. кстати для сборки библиотеки нельзя пользоваться обычным ar, только компилером у IBM чтобы попользоваться БД шаблонов надо не только ключи компилеру указать, но и явно показать на файлы где находятся определения шаблонных методов. Akh! Я понимаю что чукча не читатель, а писатель но купи седе книжку трупа страуса про С++. Там тебе объяснят что это из-за множественного наследования, вдруг ты решишь отнаследоваться от двух классов у каждого из которых есть метод foo(int). Вот чтобы это было можно ответственность свалили на программера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2006, 13:21 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
blindedAkh! Я понимаю что чукча не читатель, а писатель но купи седе книжку трупа страуса про С++. Там тебе объяснят что это из-за множественного наследования, вдруг ты решишь отнаследоваться от двух классов у каждого из которых есть метод foo(int). Вот чтобы это было можно ответственность свалили на программера. У меня сейчас банда четырех стоит приоритетом, так я и эту задачу не могу возобновить. Вообщем, действительно полная анархия. Чето-то я думал, что при множественном наследовании, предки не должны иметь одинаковые public/protected методы или могут иметь, но их надо вызывать с явным указанием предка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2006, 13:40 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
А вот ты и ошибаешься. Могут иметь, причем разрешить неоднозначность призван рограммер пишущий класс-наслндник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2006, 17:42 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
blindedА вот ты и ошибаешься. Могут иметь, причем разрешить неоднозначность призван рограммер пишущий класс-наслндник. А если не разрешит, то ему подсунут, что попало? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2006, 18:27 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
НЕ угадал, он как и ты в наследнике не увидит, методов в наследнике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2006, 13:12 |
|
||
|
templated funcrion
|
|||
|---|---|---|---|
|
#18+
blindedНЕ угадал, он как и ты в наследнике не увидит, методов в наследнике. Хорошо. Имеет класс 2 одинаковых метода, полученных множественным наследованием или 2-х инстанциацией. Если это первый случай, то методы не видны и их надо явно прописывать через класс-предок, который их предоставил. А если это 2-й случай, то методы все видны, ибо они порождены от одного класса и указать явно, какой инстанциаций надо пользоваться нет возможности. Но это являестя противоречием, которое должен отлавливать линковщик. а он этого не делает. Раз уж при множественном наследовании можно и нужно указывать конкретный класс предок при использовании метода, а в инстанциации нет такой возможности, то при чем тут множественное наследование, раз уж мы говорим про множественную инстанциацию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2006, 13:48 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=57&tid=2030022]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
164ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 469ms |

| 0 / 0 |
