Подтвердить что ты не робот

Шаблоны распространяются по нескольким файлам

С++ кажется довольно грубым при объявлении шаблонов для нескольких файлов. Более конкретно, при работе с шаблонами классов компоновщик ожидает описания всех методов для класса в одном объектном файле компилятора. Когда вы принимаете во внимание заголовки, другие декларации, наследование и т.д., Все становится по-настоящему беспорядочным.

Есть ли общий совет или обходные пути для организации или перераспределения шаблонных определений членов в нескольких файлах?

4b9b3361

Ответ 1

Есть ли общий совет или обходные пути для организации или перераспределения шаблонных определений членов в нескольких файлах?

Да; нет.

Спецификация С++ позволяет компилятору "видеть" весь шаблон (декларация и определение) в момент создания экземпляра, и (из-за сложностей любой реализации) большинство компиляторов сохраняют это требование. Результатом является то, что # включение любого заголовка шаблона также должно содержать #всех и всех источников, необходимых для создания экземпляра шаблона.

Самый простой способ справиться с этим - сбрасывать все в заголовок, встроенный, где это возможно, вне очереди, если это необходимо.

Если вы считаете это неприемлемым оскорблением, общий вариант состоит в том, чтобы разбить шаблон на обычную пару заголовок/реализацию, а затем # включить файл реализации в конце заголовка.

Функция экспорта "С++" С++ может или не может обеспечить другой способ обхода. Функция плохо поддерживается и плохо определена; хотя в принципе это должно допускать некоторую отдельную компиляцию шаблонов, это не обязательно устраняет требование, чтобы компилятор мог видеть весь корпус шаблона.

Ответ 2

Сколько файлов? Если вы просто хотите отделить определения классов от реализации, попробуйте эту статью в С++ faqs. Это единственный способ, которым я знаю, что работает на данный момент, но некоторые IDE (например, Eclipse CDT) не будут правильно связывать этот метод, и вы можете получить много ошибок. Однако, написав свои собственные make файлы или используя Visual С++, это всегда сработало для меня: -)

Ответ 3

Когда/если ваш компилятор поддерживает С++ 0x, ключевое слово extern можно использовать для разделения объявлений шаблонов из определений.

См. здесь для краткого объяснения.

Кроме того, в разделе 6.3 "Модель разделения" шаблонов С++: Полное руководство Дэвида Вандевоорда и Николая М. Йосуттиса описывает другие варианты.

alt text http://ak.buy.com/db_assets/prod_images/235/31025235.jpg