Visual Studio 2010与mixin中的typedef typename不同

时间:2015-12-21 21:29:41

标签: c++ visual-studio-2010

我有一些代码用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的内容吗?

1 个答案:

答案 0 :(得分:1)

您是否有理由重新定义PointType中的类型成员Timestamp?您已经从希望包含PointType类型成员的类型继承,这意味着Timestamp具有PointType类型成员以及继承。如果从Timestamp中删除此typedef,则不应该出现此问题。

我不熟悉Eigen,但我想它是this library。如果是,则文档显示Vector3dMatrix的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,因为你已经继承了它。