Шаблоны распространяются по нескольким файлам - PullRequest
22 голосов
/ 30 августа 2008

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

Существуют ли какие-либо общие рекомендации или обходные пути для организации или перераспределения шаблонных определений элементов между несколькими файлами?

Ответы [ 3 ]

26 голосов
/ 30 августа 2008

Существуют ли общие рекомендации или обходные пути для организации или перераспределения шаблонных определений элементов между несколькими файлами?

Да; нет.

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

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

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

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

5 голосов
/ 30 августа 2008

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

3 голосов
/ 18 сентября 2008

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

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

Также в разделе 6.3 «Модель разделения» из Шаблоны C ++: Полное руководство Дэвида Вандевурда и Николая М. Йосуттиса описаны другие варианты.

alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...