これは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に興味があります。