首页 > 解决方案 > GCC 中的模板实例化与 Visual C++ 不同

问题描述

我无法将在 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 时收到一个编译错误,其中未定义对“int GetValue(A)”的引用。

我的真实案例实际上更复杂,模板代码位于链接的库中。即使在使用“nm”检查时我可以看到实例化模板函数位于库中,我也会收到链接错误。

如何让这种类型的模板实例化与 GCC 一起使用?

标签: c++linuxwindowsgccvisual-studio-2017

解决方案


定义特化时,您需要删除类型参数...将代码从

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

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

一切都会按预期进行


推荐阅读