Упреждающее объявление (forward declaration) для шаблонных классов |
Здравствуйте, гость ( Вход | Регистрация )
Упреждающее объявление (forward declaration) для шаблонных классов |
daorus |
30.10.2010, 20:18
Сообщение
#1
|
Студент Группа: Участник Сообщений: 20 Регистрация: 30.10.2010 Пользователь №: 2163 Спасибо сказали: 0 раз(а) Репутация: 0 |
Какой синтаксис форвад-декларации для типа хеш, если я хочу в классе хранить на него указатель
Сообщение отредактировал Litkevich Yuriy - 30.10.2010, 20:27
Причина редактирования: Перенёс, так как относится не к Qt, а к Си++
|
|
|
Iron Bug |
31.10.2010, 12:08
Сообщение
#2
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Исторически появились как необходимость кросс-вставки классов. воот. так что кроме ссылок на самого себя и циклических ссылок это, конечно, можно, но нафиг нигде не нужно. ибо всё,что нужно компилеру - это увидеть описание класса до его использования в коде, что, в случае простого использования класса, достигается вставкой инклюда в одном месте кода, как правило в заголовочнике, где он используется. а в обычном случае, без циклических ссылок, предварительные объявления без инклюда, тем более для стандартно или библиотечно определённых шаблонов, ни к чему, кроме ещё одного лишнего прохода при компиляции, не приводят. куда ты его вставишь - дело десятое. если класс сам по себе используется, то компилятор обработает его один раз. так что "экономия" времени компиляции будет только в случае библиотеки, которая оперирует только указателями и никогда не обращается к самому классу. о да. Столкнулся несколько раз, пытался решить, спрашивал советы - так и оставил в заголовочнике весь шаблон. я как-то тоже напоролась на это. это баг мелкософта. об этом написано где-то в MSDN, только мелким-мелким шрифтом на страничке, которую так просто и не найти там порядка восьми несовместимостей со стандартом у них имеется. в прочих компилерах этого нет. Топик начался с того, что для шаблонных классов создание обычной декларации не катит, а как катит я не знал. И тут мне на форуме подсказали супер-мегафичу, которую я домыслил и оказалось, что для шаблонов форвард-декларацией является как бы создание экземлпяра шаблона! + кстати, подсказанный пример можно существенно сократить, выкинув сигнатуры классов в шаблоне KEY, T. Главное - сохранить кол-во классов в шаблоне. всё объясняется проще: когда мелкософтовский компилер собирает модули, он считает, что если нет экземпляра шаблонного класса - то его описание можно просто выкинуть. это и есть баг компилера, его несоответствие стандарту. просто для MSVC нужно, чтобы либо инклюд был явно включен в файл, где шаблон будет использован, либо вот так вот, как ты описал, извратиться и заставить компилер учесть шаблонный класс методом создания фиктивного объекта. Сообщение отредактировал Iron Bug - 31.10.2010, 12:25 |
|
|
Текстовая версия | Сейчас: 22.12.2024, 5:26 |