编译时的特征断言错误,错误不清楚

时间:2013-07-09 01:28:43

标签: c++ eigen

所以我试图创建一个类,它基本上充当与特征矩阵进行分区的接口,以及一些额外的功能。我的数据结构的基本副本是:

template <class T>
class DataFile {
public:
    typedef Eigen::Matrix<DataType, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> RMatrix;
    DataFile(int inputRows, int inputColumns) {
        dataMatrix = RMatrix::Zero(inputRows, inputColumns);
    }
    inline typename RMatrix::RowXpr getSample(const int row) { return dataMatrix.row(row) }

private:
    RMatrix dataMatrix;

这只是一个简单的看看我做了什么以及什么似乎是相关的。当我使用Qtcreator和MSVC2008编译我的代码时,我收到以下错误消息:

c:\apis_x64\eigen-eigen-ca142d0540d3\eigen\src/Core/DenseCoeffsBase.h(390) : error C2039: 'THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD' : is not a member of 'Eigen::internal::static_assertion<condition>'
        with
        [
            condition=false
        ]
        c:\apis_x64\eigen-eigen-ca142d0540d3\eigen\src/Core/DenseCoeffsBase.h(388) : while compiling class template member function 'float &Eigen::DenseCoeffsBase<Derived,Level>::operator [](__int64)'
        with
        [
            Derived=Eigen::Matrix<float,-1,-1,1>,
            Level=1
        ]
        c:\apis_x64\eigen-eigen-ca142d0540d3\eigen\src/Core/DenseCoeffsBase.h(653) : see reference to class template instantiation 'Eigen::DenseCoeffsBase<Derived,Level>' being compiled
        with
        [
            Derived=Eigen::Matrix<float,-1,-1,1>,
            Level=1
        ]
        c:\apis_x64\eigen-eigen-ca142d0540d3\eigen\src/Core/util/XprHelper.h(365) : see reference to class template instantiation 'Eigen::DenseCoeffsBase<Derived>' being compiled
        with
        [
            Derived=Eigen::Matrix<float,-1,-1,1>
        ]
        c:\apis_x64\eigen-eigen-ca142d0540d3\eigen\src/Core/DenseBase.h(53) : see reference to class template instantiation 'Eigen::internal::special_scalar_op_base<Derived,Scalar,OtherScalar>' being compiled
        with
        [
            Derived=Eigen::Matrix<float,-1,-1,1>,
            Scalar=float,
            OtherScalar=float
        ]
        c:\apis_x64\eigen-eigen-ca142d0540d3\eigen\src/Core/MatrixBase.h(65) : see reference to class template instantiation 'Eigen::DenseBase<Derived>' being compiled
        with
        [
            Derived=Eigen::Matrix<float,-1,-1,1>
        ]
        c:\apis_x64\eigen-eigen-ca142d0540d3\eigen\src/Core/PlainObjectBase.h(89) : see reference to class template instantiation 'Eigen::MatrixBase<Derived>' being compiled
        with
        [
            Derived=Eigen::Matrix<float,-1,-1,1>
        ]
        c:\apis_x64\eigen-eigen-ca142d0540d3\eigen\src/Core/Matrix.h(144) : see reference to class template instantiation 'Eigen::PlainObjectBase<Derived>' being compiled
        with
        [
            Derived=Eigen::Matrix<float,-1,-1,1>
        ]
        d:\users\public\documents\myCode\DataFilesV2.h(46) : see reference to class template instantiation 'Eigen::Matrix<_Scalar,_Rows,_Cols,_Options>' being compiled
        with
        [
            _Scalar=float,
            _Rows=-1,
            _Cols=-1,
            _Options=1
        ]
c:\apis_x64\eigen-eigen-ca142d0540d3\eigen\src/Core/DenseCoeffsBase.h(390) : error C2065: 'THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD' : undeclared identifier

d:\users\public\documents\myCode\DataFilesV2.h(46)在我的代码中引用了行inline typename RMatrix::RowXpr getSample(const int row) { return dataMatrix.row(row) }。我之前已经能够在我的代码的其他部分中完成这项工作了,所以我的想法是它正在调用它。但是,在我称之为的所有时间里,没有使用[]或不正确使用RowXpr.我需要经过很多代码,所以我不确定如何找到这个错误并且可能会对可能出错的问题或者如何找出导致错误的问题使用一些想法。

2 个答案:

答案 0 :(得分:2)

我最终找到了错误,这就是Eigen所说的。我从一个数组到一个特征矩阵的转换中有一个剩余的[]。但问题甚至与错误指向的位置无关。我必须通过并注释错误指向的位置,直到最后错误消失,我可以推断出代码的哪一部分是错误的真正来源。

答案 1 :(得分:1)

一旦我在getSample的定义中修复了缺少的分号,g ++ - 4.8和clang ++ - 3.3都会编译下面的简单测试用例(基本上是一个简单的DataType结构的例子):

$ cat test.cpp
#include <Eigen/Dense>

struct DataType
{
    double x;
};

template <class T>
class DataFile {
public:
    typedef Eigen::Matrix<DataType, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> RMatrix;
    DataFile(int inputRows, int inputColumns) {
        dataMatrix = RMatrix::Zero(inputRows, inputColumns);
    }
    inline typename RMatrix::RowXpr getSample(const int row) { return dataMatrix.row(row); }

private:
    RMatrix dataMatrix;
};

int main()
{
    return 0;
}

编辑很好:

$ clang++-mp-3.3 -I/opt/local/include/eigen3 test.cpp
$ g++ -I/opt/local/include/eigen3 test.cpp

所以,除了分号之外,你的例子对我来说似乎很好。我的例子是否为你编译?