在Egeng 2库中使用线性回归时,模板参数推导/替换失败 我在一个现有的C++代码库中工作,调用函数有问题。

在Egeng 2库中使用线性回归时,模板参数推导/替换失败 我在一个现有的C++代码库中工作,调用函数有问题。,c++,eigen,C++,Eigen,我试图使用代码库中已有的一个旧的特征库中的线性回归函数,您可以看到,但下面是相关的声明 template<typename VectorType> void linearRegression(int numPoints, VectorType **points, VectorType *result, int funcOfOthers ) { ... }

我试图使用代码库中已有的一个旧的特征库中的线性回归函数,您可以看到,但下面是相关的声明

template<typename VectorType>
void linearRegression(int numPoints,
                      VectorType **points,
                      VectorType *result,
                      int funcOfOthers )
{ ... }
模板
无效线性回归(整数个点,
矢量类型**点,
VectorType*结果,
int funcOfOthers)
{ ... }
以下是我的匿名代码副本:

// MyClass has member variable int maxIdx = 5
void MyClass::myFunction()
{
    Eigen::Vector2d points[maxIdx];
    Eigen::Vector2d coeffs;
    for(int i = 0; i < maxIdx; i++)
    {
        points[i] = Eigen::Vector2d(data->mydata[i].x, data->mydata[i].y);
    }
    Eigen::linearRegression( maxIdx, &points, &coeffs, 1 );

    // do more stuff with coeffs
}
//MyClass的成员变量int maxIdx=5
void MyClass::myFunction()
{
本征::矢量2D点[maxIdx];
本征:向量2D系数;
对于(int i=0;i我的数据[i].x,数据->我的数据[i].y);
}
本征::线性回归(maxIdx,&点,&系数,1);
//用系数做更多的事情
}
这是我尝试编译时收到的错误消息:

myfile.cpp:803:67: error: no matching function for call to 'linearRegression(int, Eigen::Vector2d (*)[((MyClass*)this)->MyClass::maxIdx], Eigen::Vector2d*, int)'
         Eigen::linearRegression( maxIdx, &points, &coeffs, 1 );
                                                                   ^
myfile.cpp:803:67: note: candidate is:
In file included from [redacted]:
lib/Eigen/src/Eigen2Support/LeastSquares.h:85:6: note: template<class VectorType> void Eigen::linearRegression(int, VectorType**, VectorType*, int)
 void linearRegression(int numPoints,
      ^
lib/Eigen/src/Eigen2Support/LeastSquares.h:85:6: note:   template argument deduction/substitution failed:
myfile.cpp:803:67: note:   mismatched types 'VectorType*' and 'Eigen::Vector2d [((MyClass*)this)->MyClass::maxIdx] {aka Eigen::Matrix<double, 2, 1> [((MyClass*)this)->MyClass::maxIdx]}'

myfile.cpp:803:67:错误:调用“linearRegression(int,Eigen::Vector2d(*)[((MyClass*)this)->MyClass::maxIdx],Eigen::Vector2d*,int]没有匹配函数”
本征::线性回归(maxIdx,&点,&系数,1);
^
myfile.cpp:803:67:注:候选人是:
在[修订]中包含的文件中:
lib/Eigen/src/Eigen2Support/LeastSquares.h:85:6:注:模板void-Eigen::linearRegression(int,vectotype**,vectotype*,int)
无效线性回归(整数个点,
^
lib/Eigen/src/Eigen2Support/LeastSquares.h:85:6:注意:模板参数推导/替换失败:
myfile.cpp:803:67:注意:不匹配的类型“VectorType*”和“Eigen::Vector2d[((MyClass*)this)->MyClass::maxIdx]{aka Eigen::Matrix[((MyClass*)this)->MyClass::maxIdx]}
这几乎是库源代码中示例代码的精确副本,因此我有点不知道如何修复它。我对模板不太熟悉,因此类型错误可能与此有关?

根据该源代码(与他们示例中编写的内容不同),
应为指向点的指针数组。即

Eigen::Vector2d*点[maxIdx];

所以

Eigen::Vector2d点[maxIdx];
特征::矢量2D*点_ptrs[maxIdx];
对于(int i=0;i
对于
Vector2d
来说,这似乎很愚蠢,但可能是为不好复制的巨大向量而设计的。

根据该来源(与他们示例中编写的内容不同),
应该是指向点的指针数组。也就是说

Eigen::Vector2d*点[maxIdx];

所以

Eigen::Vector2d点[maxIdx];
特征::矢量2D*点_ptrs[maxIdx];
对于(int i=0;i

这对于
Vector2d
来说似乎很愚蠢,但可能是为不好复制的巨大向量而设计的。

为了补充@numzero的答案,该代码已编译,但我在尝试执行它时遇到运行时崩溃。看起来第二个参数需要指向指针数组中的第一个索引。解释了发生了什么尽管它已编译,但仍在运行时失败

以下是最终对我有效的方法:

Eigen::Vector2d points[numPoints];
Eigen::Vector2d* point_ptrs[numPoints];
Eigen::Vector2d coeffs;
for(int i = 0; i < numPoints; i++)
{
    points[i] = Eigen::Vector2d(data->mydata[i].x, data->mydata[i].y);
    point_ptrs[i] = &points[i];
}
Eigen::linearRegression( maxIdx, &(point_ptrs[0]), &coeffs, 1 );

Eigen::Vector2d点[numPoints];
本征::矢量2D*点[numPoints];
本征:向量2D系数;
对于(int i=0;i我的数据[i].x,数据->我的数据[i].y);
点_ptrs[i]=&点[i];
}
本征:线性回归(maxIdx,&(point_ptrs[0]),&系数,1);

为了进一步说明@numzero的答案,该代码已编译,但当我尝试执行它时,遇到了运行时崩溃。看起来第二个参数需要指向指针数组中的第一个索引。解释了发生了什么,以及它在运行时失败时发生了什么,即使它已编译

以下是最终对我有效的方法:

Eigen::Vector2d points[numPoints];
Eigen::Vector2d* point_ptrs[numPoints];
Eigen::Vector2d coeffs;
for(int i = 0; i < numPoints; i++)
{
    points[i] = Eigen::Vector2d(data->mydata[i].x, data->mydata[i].y);
    point_ptrs[i] = &points[i];
}
Eigen::linearRegression( maxIdx, &(point_ptrs[0]), &coeffs, 1 );

Eigen::Vector2d点[numPoints];
本征::矢量2D*点[numPoints];
本征:向量2D系数;
对于(int i=0;i我的数据[i].x,数据->我的数据[i].y);
点_ptrs[i]=&点[i];
}
本征:线性回归(maxIdx,&(point_ptrs[0]),&系数,1);