模板类中的静态函数:gcc vs VS.

时间:2018-02-26 06:38:20

标签: c++

以下c ++代码编译并与Visual Studio 2017一起使用,但在'>'之前给出错误"期望的主要表达式令牌"用gcc 5.0。知道为什么吗? Description是一个结构,Description :: add是一个函数模板。

template <class X>
struct DataPoint
{
    X value;

    DataPoint()
    : value(0.) {}

    DataPoint( X value )
    : value(value) {}

    static void describe(Description< DataPoint<X> > & desc)
    {
        desc.add<X>("f", ".", offsetof(DataPoint<X>, value));
    }
}

事实上,当没有指定DataPoint模板类型时,VS甚至不会抱怨:

static void describe(Description<DataPoint> & desc)
{
    desc.add<X>("f", ".", offsetof(DataPoint, value));
}

1 个答案:

答案 0 :(得分:2)

您的代码不是标准C ++。 add中的desc.add<X>是从属名称,因此编译器不知道它是否是模板。 Visual C ++仍然没有实现整个两阶段查找,所以它让它通过并不奇怪。但是g ++(和clang等)要求你使用template关键字。

desc.template add<X>("f", ".", offsetof(DataPoint, value));