Это продолжение шаблонов C ++: предотвращение создания базового шаблона
Я использую шаблоны для достижения перегрузки функций без путаницы неявных преобразований типов: объявляю шаблон функции, определяю нужные специализации (перегрузки). все хорошо, кроме неправильного кода не выдает ошибок до фазы соединения:
lib.hpp:
template<class T> T f(T v);
lib.cpp:
#include "lib.hpp"
template<> long f(long v) { return -v; }
template<> bool f(bool v) { return !v; }
main.cpp:
#include <iostream>
#include "lib.hpp"
int main()
{
std::cout
<< f(123L) << ", "
<< f(true) << ", "
<< f(234) << "\n"
;
}
вывод gcc:
c++ -O2 -pipe -c main.cpp
c++ -O2 -pipe -c lib.cpp
c++ main.o lib.o -o main
main.o(.text+0x94): In function `main':
: undefined reference to `int get<int>(int)'
Я бы хотел, чтобы он не работал во время компиляции main.cpp. Можно ли как-то объявить только фактически реализованные специализации?
Какие у меня варианты? Цель - C ++ 03, и я в основном заинтересован в gcc-4.x и VC9.