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





Через сколько файлов? Если вы просто хотите отделить определения классов от реализации, попробуйте Эта статья в часто задаваемых вопросах C++. Это единственный известный мне способ, который работает на данный момент, но некоторые IDE (например, Eclipse CDT) не связывают этот метод должным образом, и вы можете получить много ошибок. Однако написание собственных make-файлов или использование Visual C++ всегда помогало мне :-)
Are there any general advice or workarounds for organizing or redistributing templated member definitions across multiple files?
Да; не надо.
Спецификация C++ позволяет компилятору иметь возможность «видеть» весь шаблон (определение и объявления) в момент создания экземпляра, и (из-за сложности любой реализации) большинство компиляторов сохраняют это требование. В результате # включение любого заголовка шаблона должно также # включать любой источник, необходимый для создания экземпляра шаблона.
Самый простой способ справиться с этим - выгрузить все в заголовок, встроить, где возможно, и вне строки, где это необходимо.
Если вы действительно считаете это неприемлемым оскорблением, распространенным вариантом является разделение шаблона на обычную пару заголовок / реализация, а затем # включить файл реализации в конец заголовка.
Функция экспорта C++ может предоставить или не предоставить другой обходной путь. Эта функция плохо поддерживается и плохо определена; хотя в принципе он должен разрешать какую-то отдельную компиляцию шаблонов, это не обязательно устраняет требование, чтобы компилятор мог видеть все тело шаблона.
Когда / если ваш компилятор поддерживает C++ 0x, ключевое слово extern можно использовать для отделения объявлений шаблонов от определений.
См. здесь для краткого объяснения.
Кроме того, в разделе 6.3 «Модель разделения» документа Шаблоны C++: полное руководство Дэвида Вандеворда и Николая М. Джозаттиса описаны другие варианты.

ссылка на статью устарела!