以下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));
}
答案 0 :(得分:2)
您的代码不是标准C ++。 add
中的desc.add<X>
是从属名称,因此编译器不知道它是否是模板。 Visual C ++仍然没有实现整个两阶段查找,所以它让它通过并不奇怪。但是g ++(和clang等)要求你使用template
关键字。
desc.template add<X>("f", ".", offsetof(DataPoint, value));