在我发现 MSVC 和 GCC 之间在编译和链接相同代码时不一致(可能也是 clang)之后,我很好奇这个程序是否真的编译和链接,因此它是 MSVC 中的错误(报告链接器错误)或应该我写的不一样。该程序由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
移出结构定义,甚至将其置于专业化声明之上,使程序链接成功,但我想确定。
所以我的问题是 - 这个程序是否应该由符合标准的编译器/链接器编译和链接而没有错误?