以下程序是否应按标准编译?

Pre*_*nik 10 c++ template-specialization visual-c++ class-template

在我发现MSVC和GCC(也可能是clang)之间在编译和链接相同代码时的不兼容之后,我很好奇这个程序是否实际编译和链接,因此它是MSVC中的错误(报告链接器错误)或应该我用不同的方式写它.该计划包括3个文件:

template <typename T>
struct A
{
    void func() {};
};

template <>
void A<int>::func ();
Run Code Online (Sandbox Code Playgroud)

A.cpp:

#include "C.h"
int main()
{
    A<int> x;
    x.func();
}
Run Code Online (Sandbox Code Playgroud)

B.cpp:

#include "C.h"
template <>
void A<int>::func()
{
}
Run Code Online (Sandbox Code Playgroud)

MSVC产生的链接器错误是:

A.obj:错误LNK2019:未解析的外部符号"public:void __thiscall A :: func(void)"

所以基本上它决定不在定义中创建符号B.cpp.让我强烈怀疑它是一个错误的东西是移动func结构定义的非特定定义,甚至将它放在特化声明之上使程序成功,但我想确定.

所以我的问题是 - 是否应该通过符合标准的编译器/链接器编译和链接此程序而不会出错?

Wil*_*nes 1

从标准来看:

\n\n
\n

\xc2\xa9 ISO/IEC N4527\n 14.6.4.1 实例化点 [temp.point] 1 对于函数模板特化、成员函数模板特化或\n 类的成员函数或静态数据成员的特化\n 模板,如果该特化是隐式实例化的,因为它是从另一个模板特化中引用的,并且引用它的上下文依赖于模板参数,\n 特化的实例化点是\n 封闭专业化的实例化。否则,此类特化的实例化点紧跟在引用该特化的命名空间作用域声明或定义之后

\n
\n\n

在这种情况下,我认为这意味着 Ch 发生“范围声明”。如果是这种情况,那么您的代码应该与符合标准的工具链链接。我可能会误解这个...

\n