私は最近、私を不安にさせているテンプレートを専門化しているときに状況に遭遇しました:
foo.h:
template <class T>
void foo() {
std::cout << "This is the generic foo" << std::endl;
}
foo.cc:
#include "foo.h"
template <>
void foo<int>() {
std::cout << "This is foo<int>" << std::endl;
}
main.cc:
#include "foo.h"
int main() {
foo<int>();
}
それで。私は次のようにコンパイルします:
g++ -c main.cc
g++ -c foo.cc
g++ -o main main.o foo.o
出力は"This is foo<int>"
です。私はこの出力が好きです。しかし、私が観察しているものがgccに固有のものである可能性があるのではないかと心配しています(他のコンパイラーにアクセスできないため、確認できません)。
gccが行っていることは次のとおりです。main.ccをコンパイルすると、foo.ccの特殊化を認識していないため、foo呼び出しのジェネリックコードが出力されると思います。ただし、foo.oとリンクすると、同じ署名を持つため、代わりに特殊化が使用されます。
しかし、これは頼りになるのは悪いことですか?他のコンパイラ(またはgccの異なるバージョンでも?)がテンプレートコードを出力するときに署名を壊してしまう可能性があるのではないかと心配しています。foo.oとのリンクでは、私が望むような一般的なアクションが置き換えられません。これは有効な心配ですか?私は不安を感じることをたくさん読みましたが、私の現在の状況で何が起こっているのかについて自信を持って感じるものは何もありません。