ocultar modelo de função, declarar especializações

Este é um acompanhamento paraModelos C ++: impedir a instanciação do modelo base

Eu uso modelos para obter sobrecarga de função sem a bagunça das conversões implícitas de tipo:declarar o modelo de função, defina as especializações desejadas (sobrecargas). está tudo bem, exceto que o código errado não produz erros até a fase do link:

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"
    ;
}

saída 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)'

Eu gostaria que falhasse durante a compilação do main.cpp. De alguma forma, posso declarar apenas as especializações realmente implementadas?

Quais são as minhas opções? O destino é C ++ 03, e estou interessado principalmente em gcc-4.xe VC9.

questionAnswers(4)

yourAnswerToTheQuestion