【发布时间】:2019-07-27 09:25:54
【问题描述】:
我无法将在 Visual Studio 2017 C++ 中在 Windows 上运行良好的代码移植到使用 GCC 8.2 的 Linux 上。
#include <stdio.h>
class A
{
public:
int value;
};
template<typename T> int GetValue(T value);
template<typename T> int GetValue(A value)
{
return value.value;
}
template int GetValue<A>(A value);
int main(int argc, char **argv)
{
A valueHolder;
valueHolder.value = 42;
int value = GetValue(valueHolder);
printf("hello %d!", value);
return 0;
}
它在 Windows 上以正确的输出编译和运行,但在 Linux 上,在主函数中使用 GetValue 时出现编译错误,Undefined reference to 'int GetValue(A)'。
我的真实案例实际上更复杂,因为模板代码位于链接的库中。即使使用“nm”检查时我可以看到实例化模板函数位于库中,我也会收到链接错误。
如何让这种类型的模板实例与 GCC 一起工作?
【问题讨论】:
-
template<typename T> int GetValue(A value)是否是template<typename T> int GetValue(T value);的特化? -
是的,模板定义“template
int GetValue(T value)”实际上是一个接口定义,而专业化是由代码的其他部分提供的,更加分散。使用场景是可以根据需要提供和链接实现,但接口仍然存在。模板化版本 GetValue 实际上是在模板化类中使用的,因此在那里使用时类型 A 是未知的。
标签: c++ linux windows gcc visual-studio-2017