Я разрабатывал библиотеку, состоящую в основном из шаблонных функций, и сумел организовать вещи (до некоторой степени) следующим образом:
// MyLib.h
class MyLib
{
template<class T>
static void Func1()
{
}
template<class T>
static void Func2()
{
}
};
И, очевидно, звонки будут сделаны так:
MyLib::Func1();
Как видите, это может быть довольно уродливо, так как добавляется больше функций. По крайней мере, я хотел бы разделить его на разные файлы!
Сначала я рассматривал определение пакетов функций в отдельных файлах в пространстве имен MyLib
, а затем использовал MyLib.h
для их объединения, но я продолжал получать кучу ошибок компоновщика - конечно, я могу подробнее рассмотреть этот подход, если это рекомендуется.
Есть мысли?
PS: Поскольку большинство этих функций имеют разные цели, нет смысла группировать их по классу, из которого мы будем создавать объекты. Я использовал class
здесь, поэтому мне не нужно беспокоиться о порядке, в котором я определил функции (также существует взаимозависимость между функциями внутри MyLib
).
Ошибки компоновщика:
Итак, основная структура такая: у меня есть два класса (скажем, A & B), которые компилируются в статические библиотеки, и мастер-приложение, которое запускает экземпляры этих классов. Эти классы A & B используют функции в MyLib
. Когда A & B компилируются, я получаю предупреждение LNK4006
, в котором говорится, что символы, принадлежащие MyLib
, уже определены в файле OBJ в проекте, и он игнорирует его.
Когда дело доходит до приложения, возникает ошибка LNK2005
, которая гласит, что она уже определена в OBJ файлах A & B.
UPDATE:
Спасибо Майк & Матье за идею inline - это была проблема!
За исключением одной проблемы: у меня есть несколько шаблонных функций, которые я специально специализировал, и они вызывают ошибку already defined
(LNK2005
):
template<class t> int Cvt(){}
template<> int Cvt<unsigned char>(){return 1;}
template<> int Cvt<char>(){return 2;}
template<> int Cvt<unsigned short>(){return 3;}
Есть идеи?
Conlusion:
Решил проблему явной специализации, определив функции шаблона в отдельном файле - спасибо за помощь!