скрыть шаблон функции, объявить специализации

Это продолжение кШаблоны 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.

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

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