同じコードのコンパイルとリンクで MSVC と GCC (おそらく clang も) の不一致を発見した後、このプログラムが実際にコンパイルしてリンクする必要があるかどうかに興味を持ちました。私はそれを別の方法で書きます。プログラムは次の 3 つのファイルで構成されます。
チャンネル
template <typename T>
struct A
{
void func() {};
};
template <>
void A<int>::func ();
A.cpp:
#include "C.h"
int main()
{
A<int> x;
x.func();
}
B.cpp:
#include "C.h"
template <>
void A<int>::func()
{
}
MSVC からの結果のリンカー エラーは次のとおりです。
A.obj : エラー LNK2019: 未解決の外部シンボル "public: void __thiscall A::func(void)"
したがって、基本的には、に配置された定義からシンボルを作成しないことにしますB.cpp
。バグとして強く疑うのは、特殊化されていない定義func
を構造体定義の外に移動し、特殊化宣言の上に配置することでプログラムのリンクが成功することですが、確認したいと思います。
だから私の質問は - このプログラムは、準拠したコンパイラ/リンカーによってエラーなしでコンパイルおよびリンクされるべきですか?