MSVCとGCC(おそらくあまりにも)同じコードのコンパイルとリンクの間の不整合の私の発見の後、私はこのプログラムが実際にコンパイルし、リンクし、MSVC(これはリンカーエラーを報告する)それとも別の方法で書かなければならないのですか?プログラムは3つのファイルで構成されています次のプログラムは標準に従ってコンパイルする必要がありますか?
Chの
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:未解決の外部シンボル「パブリック:__thiscall :: funcを(ボイド)無効」
だから基本的にはB.cpp
に配置された定義からシンボルを作成しないことを決定。私がバグとして強く疑っているのは、構造体定義からfunc
という特殊化されていない定義を移動し、それを特殊化宣言の上に置くことさえプログラムのインライン化を成功させるということですが、私は確信しています。
私の質問は - このプログラムをコンパイルし、適合するコンパイラ/リンカによってエラーなしでリンクする必要がありますか?規格から
私にはバグのようです。 MSVCの最新バージョン(2015)を使用していますか? –
@MatsPeterssonはい、2015. – Predelnik
あなたのコードはclang ++でもうまくコンパイルされます。あなたが本質的に 'func'の2つの定義を提供しているので、私はちょっと変わっています - 正しいかどうかは言語弁護士では不十分です(私はそうだと思います) –