Tro*_*yvs 3 c++ templates symbols weak specialization
首先,我有一个类的头文件,一个没有定义的专业声明(来自互联网的代码示例)
$ cat foo.h
template<typename T>
class foo{
public:
static void init(){
return;
}
};
template<> void foo<int>::init();
Run Code Online (Sandbox Code Playgroud)
然后有2个用于模板专业化的实现文件
$ cat foo_int.cpp
#include "foo.h"
#include<stdio.h>
template<>
void foo<int>::init(){
printf("init int foo\n");
}
$ cat foo_float.cpp
#include "foo.h"
#include<stdio.h>
template<>
void foo<float>::init(){
printf("init float foo\n");
}
Run Code Online (Sandbox Code Playgroud)
终于我有了一个主文件
$ cat main.cpp
#include "foo.h"
int main(){
foo<int>::init();
foo<float>::init();
}
Run Code Online (Sandbox Code Playgroud)
如果我不进行优化就编译并运行它,它将得到:
g ++ foo_int.cpp foo_float.cpp main.cpp && a.out
init int foo
init浮点foo
如果添加优化,则结果将不同:
$ g ++ foo_int.cpp foo_float.cpp main.cpp -O2 && a.out
初始化int foo
结果是不同的。互联网上的一些解释说,这是由于gcc实施中的某些“弱符号”内部机制引起的,但我的问题是:
gcc / g ++是“弱符号” /“强符号”的概念,还是c / c ++语言规范的一部分。
如果调试和发布结果不同,就“弱符号”机制而言,我是否应该说这是gcc / g ++的错误/问题?作为开发人员,我不希望调试版本的行为与发行版本有所不同。
我试过c,不幸的是同样的错误。这是C / C ++的“可接受的”情况,调试/发布的“应该”行为如此不同吗?
语言定义要求您在使用它之前声明一个明确的专业化:
如果一个模板,一个成员模板或一个类模板的成员被明确地专门化,则应在首次使用该专门化之前声明该专门化,这将在发生这种使用的每个翻译单元中引起隐式实例化; 无需诊断。[temp.expl.spec] / 6。
在foo<float>::init()从中调用时main,没有声明的显式专门化,但是在中有显式的专门化foo_float.cpp,因此程序的行为是不确定的。