【问题标题】:Template instancing in GCC differs from Visual C++GCC 中的模板实例化与 Visual C++ 不同
【发布时间】: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&lt;typename T&gt; int GetValue(A value) 是否是 template&lt;typename T&gt; int GetValue(T value); 的特化?
  • 是的,模板定义“template int GetValue(T value)”实际上是一个接口定义,而专业化是由代码的其他部分提供的,更加分散。使用场景是可以根据需要提供和链接实现,但接口仍然存在。模板化版本 GetValue 实际上是在模板化类中使用的,因此在那里使用时类型 A 是未知的。

标签: c++ linux windows gcc visual-studio-2017


【解决方案1】:

在定义特化时,您需要删除类型参数...更改代码

template<typename T> int GetValue(A value)
{
    return value.value;
}

template<> int GetValue(A value)
{
    return value.value;
}

一切都会按预期进行

【讨论】:

  • 请注意,在这个特定示例中,您不妨使用简单的函数重载(根本没有模板)。
猜你喜欢
  • 2013-01-18
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多