我有一些代码用gcc编译好但Visual Studio不喜欢。我把它提炼到下面的一个最小例子:
#include "stdafx.h"
#include <Eigen/Dense>
template<class Base>
class Timestamp : public Base
{
public:
typedef typename Base::PointType PointType;
double timestamp;
};
/*
struct Point {};
struct PointXYZ : public Point
{
typedef PointXYZ PointType;
};
*/
struct PointXYZ : public Eigen::Vector3d
{
typedef PointXYZ PointType;
};
int _tmain(int argc, _TCHAR* argv[])
{
Timestamp<PointXYZ> point;
return 0;
}
错误为"error C2039: 'PointType' : is not a member of 'Eigen::PlainObjectBase<Derived>'"
类PlainObjectBase是Eigen库的一部分。如果我将PointXYZ的定义替换为来自空的&#34; Point&#34;的注释中的定义。类,它在VS中编译也很好。有关为什么会发生这种情况的建议以及VS可以更改为接受它作为gcc的内容吗?
答案 0 :(得分:1)
您是否有理由重新定义PointType
中的类型成员Timestamp
?您已经从希望包含PointType
类型成员的类型继承,这意味着Timestamp
具有PointType
类型成员以及继承。如果从Timestamp
中删除此typedef,则不应该出现此问题。
我不熟悉Eigen,但我想它是this library。如果是,则文档显示Vector3d
是Matrix
的typedef(即Vector3d
只是Matrix
),其本身包含 a typedef,名为Base
,代表基类PlainObjectBase<Matrix>
:
typedef PlainObjectBase<Matrix> Base;
我的猜测是,当你这样做时:
typedef typename Base::PointType PointType;
Base
被评估为矩阵'Base
typedef而不模板类型参数Base
,所以它有效地尝试做你的错误消息说:
typedef typename PlainObjectBase<Derived>::PointType PointType;
这明显失败,因为PlainObjectBase
不包含PointType
类型的成员,更不用说这不是你想要做的了。
将Timestamp
的模板类型参数更改为B
是否会解决问题?
template<class B>
class Timestamp : public B
{
public:
typedef typename B::PointType PointType;
double timestamp;
};
这将确认这是问题,并且可能确实是Visual Studio 2010中的错误(如果可以,请尝试更高版本)。就个人而言,我建议只删除typedef,因为你已经继承了它。