【发布时间】:2015-12-02 01:30:51
【问题描述】:
在我发现 MSVC 和 GCC 之间在编译和链接相同代码时不一致(可能也是 clang)之后,我开始好奇这个程序是否真的可以编译和链接,因此它是 MSVC 中的错误(报告链接器错误) ) 或者我应该以不同的方式写它。该程序由 3 个文件组成:
C.h
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 : error LNK2019: unresolved external symbol "public: void __thiscall A::func(void)"
所以基本上它决定不创建放在B.cpp 中的未定义符号。让我强烈怀疑它是一个错误的事情是,将func 的非专业定义从结构定义中移出,甚至将其置于专业化声明之上,这使得程序链接成功,但我想确定一下。
所以我的问题是 - 这个程序是否应该由符合标准的编译器/链接器编译和链接而没有错误?
【问题讨论】:
-
对我来说看起来像一个错误。您使用的是最新 (2015) 版本的 MSVC 吗?
-
@MatsPetersson 是的,2015 年。
-
您的代码也可以使用 clang++ 编译。这有点奇怪,因为您本质上为
func提供了两个定义 - 我还不足以作为语言律师来判断这是否正确(我认为是) -
顺便也用clang++ -std=c++03 编译。
-
我的评论主要是为了说明问题出在哪里,这绝对是编译器中的一个错误,如果其他人遇到这个问题,请给出解决方法。随时向 Microsoft 报告。
标签: c++ visual-c++ template-specialization class-template