перекрестные указатели в шаблонах |
Здравствуйте, гость ( Вход | Регистрация )
перекрестные указатели в шаблонах |
mezmay |
19.7.2011, 11:11
Сообщение
#1
|
Активный участник Группа: Участник Сообщений: 272 Регистрация: 13.7.2009 Из: Ростов-на-Дону Пользователь №: 904 Спасибо сказали: 16 раз(а) Репутация: 1 |
Есть 2 шаблона классов. Как сделать так чтобы они оба содержали указатели друг на друга и работали с этими указателями? В случае когда каждый шаблон полностью описан в заголовочном файла это сделать я так понял невозможно
|
|
|
Iron Bug |
19.7.2011, 19:56
Сообщение
#2
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Как-то так, например:
Но там была бага со старыми студиями. Вроде 6-я студия это не сожрёт. А новые компилеры вроде все поддерживают. Можно разделить на два хедера:
P.S. шаблоны лучше вообще запихивать в cpp файлы. у мелкософта были косяки с шаблонами в заголовочниках. я сейчас смутно помню, в чём они заключались, но суть была такая, что лучше их запихивать в cpp. и ещё у них есть проблемы с шаблонами в dll. там надо создавать пустые представители класса, иначе линкер выкинет шаблон из библиотеки. впрочем, может, последние студии стали более продвинуты в этом плане, я не проверяла. Сообщение отредактировал Iron Bug - 19.7.2011, 20:23 |
|
|
Litkevich Yuriy |
19.7.2011, 23:28
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Алексей1153 |
20.7.2011, 6:56
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Iron Bug, не могу въехать что-то, распутай меня )))
ведь это указатель на класс типа "classB<TB>" classB<TB> *ptrB; а указатель могут передать на любой класс, например classB<X>* получается, что у компилятора не будет информации, на какой именно класс указывает указатель. Как же он будет раскрывать разыменование? |
|
|
Iron Bug |
20.7.2011, 7:54
Сообщение
#5
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
получается, что у компилятора не будет информации, на какой именно класс указывает указатель. Как же он будет раскрывать разыменование? в общем случае, на уровне темплейтов такого контроля нет. когда собирается готовый проект, тогда компилятор по конкретному случаю уже смотрит, что и как. сам по себе темплейт такой встроенной проверки не содержит. однако, есть техника SFINAE. можно указывать требуемые свойства класса. но не все компиляторы это поддерживают, насколько я знаю. про SFINAE много написано (например, тут можно посмотреть примеры: http://stackoverflow.com/questions/257288/...ions-existence). ещё есть специализация темплейтов (ref) - когда для каждого параметра можно указать отдельное решение (например, можно почитать здесь: http://msdn.microsoft.com/en-us/magazine/cc163754.aspx). кроме того, можно использовать страндартную проверку RTTI. Сообщение отредактировал Iron Bug - 20.7.2011, 7:59 |
|
|
Алексей1153 |
20.7.2011, 18:20
Сообщение
#6
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
про эту штуку я давно в курсе (только не знал, как называется). Вопрос о другом. Ведь шаблонный класс компилятор рассматривает как полноправный класс, то есть classB<int> - это полноценный тип. А тут вот что:
и я не понимаю, как так компилятор позволит сделать. В общем то, компилятор ругается таким загадочным образом: Цитата error C2440: =: невозможно преобразовать 'classB<T_classB> *' в 'classB<T_classB> *' error C2440: =: невозможно преобразовать 'classA<T_classA> *' в 'classA<T_classA> *' хотя я ожидал другое ))) Навроде error C2440: =: невозможно преобразовать 'classB<char> *' в 'classB<TB> *' error C2440: =: невозможно преобразовать 'classA<int> *' в 'classA<TA> *' всё, у меня крыша едет )) Кстати, раз уж такая пьянка, давно меня интересует вопрос, почему нельзя было сделать в C/C++ проверку времени компиляции навроде:
по моему, это очень просто и иногда требуется. Почему такого не сделали ? Сообщение отредактировал Алексей1153 - 20.7.2011, 18:21 |
|
|
Iron Bug |
20.7.2011, 19:38
Сообщение
#7
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
это вопросы не ко мне, а к комитету по стандартизации. там про шаблоны всё написано и требований к контролю классов в них нет. да и быть не может. собственно, шаблон существует только до компиляции. это НЕ класс, не структура в памяти. это просто метод упрощения написания кода, с помощью абстрагирования.
ты пытаешься скрестить классы и базовые типы данных. это разные вещи, читай теорию. они совершенно по-разному хранятся в памяти, компилятор не умеет самостоятельно неявно преобразовывать базовые типы к классам. кроме того, базовые ещё делятся на скалярные и составные. и там тоже есть специфика. если хочешь, чтобы аргументы разных типов принимались, как базовый класс шаблона, то либо пиши специализации для этих типов отдельно, либо добавляй конструкторы копии базового класса из этих типов. собственно, вряд ли от шаблонов требуется такая гибкость. упрощение - это упрощение. ради него не стоит лезть совсем уж в дебри. Сообщение отредактировал Iron Bug - 20.7.2011, 19:57 |
|
|
Алексей1153 |
20.7.2011, 19:43
Сообщение
#8
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
но итог то един - приведённый тобой код в студии 2008 не компилится
Цитата error C2440: =: невозможно преобразовать 'classB<T_classB> *' в 'classB<T_classB> *' error C2440: =: невозможно преобразовать 'classA<T_classA> *' в 'classA<T_classA> *' хотя это взрыв башки, если честно Сообщение отредактировал Алексей1153 - 20.7.2011, 19:44 |
|
|
Iron Bug |
20.7.2011, 19:46
Сообщение
#9
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
но итог то един - приведённый тобой код в студии 2008 не компилится ну, что я могу сказать... я никогда не была сторонником мелкософта. они очень сильно отстают от стандартов и вообще у них в компиляторах давняя традиция глюков и несоответствий в области темплейтов. они об этом и сами писали. может, десятая студия получше в этом плане. |
|
|
Текстовая версия | Сейчас: 27.12.2024, 4:58 |