まず、クラスのヘッダー ファイル、定義のない特殊化宣言 (インターネットからのコード サンプル) を取得しました。
$ 猫 foo.h
template<typename T>
class foo{
public:
static void init(){
return;
}
};
template<> void foo<int>::init();
次に、テンプレートの特殊化のための 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");
}
最後に、メインファイルを取得しました
$ cat main.cpp
#include "foo.h"
int main(){
foo<int>::init();
foo<float>::init();
}
最適化せずにコンパイルして実行すると、次のようになります。
g++ foo_int.cpp foo_float.cpp main.cpp && a.out
init int foo
init float foo
最適化を追加すると、結果は異なります。
$ g++ foo_int.cpp foo_float.cpp main.cpp -O2 && a.out
init int foo
結果は異なります。インターネットからの説明によると、これはgcc実装の「弱いシンボル」の内部メカニズムによるものですが、私の質問:
「弱いシンボル」/「強いシンボル」は gcc/g++ の概念ですか、それとも c/c++ 言語仕様の一部です。
デバッグとリリースの結果が異なる場合、これは「弱いシンボル」メカニズムに関する gcc/g++ のバグ/問題であると言えますか? 開発者として、私のデバッグ バージョンがリリース バージョンと異なる動作をするとは思いません。
残念ながら同じエラーが発生しました。これは、C/C++ のデバッグ/リリースの動作が「そうであるべき」「受け入れられる」ケースですか?