«Множественное определение» при использовании (макетных) заголовочных файлов для шаблонов
Я знаю, что определения шаблонных функций 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 в более чем одном файле, и я все еще ищу решение.