我最近在专门设计模板时遇到了一种情况,这让我感到不安:
富.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;
}
主.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 调用发出通用代码,因为它不知道 foo.cc 中的特化。但是通过与 foo.o 链接,它使用了特化,因为它具有相同的签名。
但这值得指望吗?我担心其他编译器(甚至可能是不同版本的 gcc?)在发出模板代码时可能会破坏他们的签名,以某种方式与 foo.o 链接不会像我想要的那样替换通用操作。这是一个有效的担忧吗?我读过很多让我感到不安的东西,但没有任何东西能让我对目前情况下发生的事情充满信心。