«Множественное определение» при использовании (макетных) заголовочных файлов для шаблонов

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

Короче,У меня ошибка «множественное определение», когда я добавляю объявление не шаблонной функции в файл реализации, Длинное объяснение с примерами следующее.

Когда пара «макет» заголовка + файлы реализациисодержит только пару объявлений / реализации шаблонной функциивсе работает нормально. Это также хорошо работает, когдаЯ добавляю реализацию новой шаблонной функции только в файл реализации.

Рабочий пример (я бы#include "algo.h" в моемmain.cpp когда я хотел использовать эту функциональность):

Заголовочный файл "Mock" algo.h:

#ifndef ALGO_H
#define ALGO_H

namespace fl{
    template <typename Compare>
    void algo(.. non-templated args .., Compare order = std::less<int>());
}

#include "tpp/algo.cpp"

#endif // ALGO_H

Файл реализации TPP / algo.cpp: (в настоящее время простоalgo.tpp)
Замечания: С использованиемtpp/.cpp файл был в исходной версии, теперь я использую.tpp файл в@ πάντα ῥεῖПредложение, объяснение в конце.

#ifndef TPP_ALGO
#define TPP_ALGO

#include "../algo.h"

namespace fl{

    template <typename Compare>
    void subFunctionality(Compare order, .. args ..){ /* impl */ }

    template <typename Compare>
    void algo(.. non-templated args .., Compare order){
         subFunctionality(order, .. args ..);
        // implementation
    }
}

#endif // TPP_ALGO

Проблема возникаеткогда я добавляю не шаблонную реализацию функции в файл реализации, (Нерабочий) примерTPP / algo.cpp (в настоящее время простоalgo.tpp) (используя тот жеalgo.h):

#ifndef TPP_ALGO
#define TPP_ALGO

#include "../algo.h"

namespace fl{

    template <typename Compare>
    void subFunctionality(Compare order, .. args ..){ /* impl */ }

    void moreSubFun(.. args ..) { /* impl */ }

    template <typename Compare>
    void algo( .. non-templated args ..., Compare order){
         subFunctionality(order, .. args ..);
         moreSubFun(.. args ..);
         // more stuff
    }
}

#endif // TPP_ALGO

Я получаю«множественное определение» ошибка (откуда я включил его вmain.cpp), вот так:

obj/Release/main.o                 In function `fl::moreSubFun(...)':
main.cpp                           multiple definitions of `fl::moreSubFun(..)'
obj/Release/../tpp/algo.o:algo.cpp first defined here

Почему это происходит только с не шаблонными функциями, а для шаблонныхи, что более важно,как мне решить эту проблему?

Я посмотрел вокруг так, и я не могу найти ничего полезного :( В идеале, я ищу что-то настолько близкое к моей собственной файловой структуре, насколько это возможно (но я возьму все, что работает, все еще используя некоторое разделение на «макет» ".h + tpp/.cpp). Должен ли я вынести дополнительные подфункции в отдельную, не шаблонную пару.h/.cpp файлы или есть другие решения? (Подфункции в идеале не должны быть видны конечному пользователю).

Я не хочу использоватьinline при определенииfl::moreSubFunc(..) так как функция довольно большая (и меня училиinline в идеале следует использовать только с небольшими функциями). Это решает проблему, но я смотрю, есть ли другое решение.

Я работаю вCode::Blocks, с помощьюgcc version 4.7.2, Это первоначальная причина, по которой мой файл реализацииtpp/.cpp (.cpp расширение), так какCode::Blocks не поддерживает его по умолчанию. Это изменено в текущей реализации после@ πάντα ῥεῖпредложение (смотри ниже).

Позднее редактирование (После того, как я учил, решение было найдено) Я учил@ πάντα ῥεῖ ответ решает проблему. Я подправилCode::Blocks принять.tpp файлы (либо рассматривая это какзаголовок или жеисточник файлы). Первоначально это решение работало.

Тем не мение,это решение работало только когдаalgo.h файл был включен только в один файл: когда я включил его только вmain.cpp, Однако, как только я попытался включить его в другой исходный файл (например,algo2.cpp) которые будут использовать эти алгоритмы (в дополнение кmain.cpp), томножественное определение проблема вернулась.

Нижняя линия,проблема все еще сохраняется, как только я включаюalgo.h в более чем одном файле, и я все еще ищу решение.

Ответы на вопрос(3)

Ваш ответ на вопрос