小编use*_*521的帖子

当链接器可以使用显式特化时,所有编译器都会忽略生成的模板代码吗?

我最近遇到一种情况,同时专门化模板让我感到不安:

foo.h中:

template <class T>
void foo() {
  std::cout << "This is the generic foo" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

foo.cc:

#include "foo.h"
template <>
void foo<int>() {
  std::cout << "This is foo<int>" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

main.cc:

#include "foo.h"

int main() {
  foo<int>();
}
Run Code Online (Sandbox Code Playgroud)

所以.我编译如下:

g++ -c main.cc
g++ -c foo.cc
g++ -o main main.o foo.o
Run Code Online (Sandbox Code Playgroud)

输出是"This is foo<int>".我喜欢这个输出.但我担心我所观察到的可能是gcc独有的(我无法访问其他编译器,所以我无法检查).

这就是我认为gcc正在做的事情:当编译main.cc时,我希望它为foo调用发出通用代码,因为它不知道foo.cc中的特殊化.但是通过与foo.o链接,它使用了特化,因为它具有相同的签名.

但这是不是值得依靠?我担心其他编译器(或者甚至是不同版本的gcc?)在发出模板代码时可能会破坏它们的签名,这种方式与foo.o的链接不会像我想要的那样取代泛型动作.这是一个有效的担心吗?我读过许多让我感到不安的事情,但没有任何让我对目前情况发生的事情充满信心的事情.

c++ templates

6
推荐指数
1
解决办法
182
查看次数

标签 统计

c++ ×1

templates ×1