将Quadprog ++与Eigen一起使用时C ++编译错误

时间:2018-11-20 04:03:03

标签: c++ eigen quadprog

这是我在这里的第一个问题,我已经搜索了很长时间,但没有解决方案。 我正在使用QUadprog ++解决一个二次问题。当我单独在测试中使用它时,还好。但是,当我将其实现到包含Eigen的项目中时,Eigen操作将出现诸如“矩阵A没有名为“ lu_inverse”的成员”之类的错误。如果我注释掉Quadprog ++的头文件(Array.hh和Quadprog ++。hh),错误就消失了。因此,我认为这是Eigen和Quadprog ++的头文件之间的冲突错误。有人知道吗?预先感谢!

2 个答案:

答案 0 :(得分:1)

您还可以切换到可以直接用于本征类型的QuadProgpp版本之一:https://github.com/asherikov/QuadProgpphttps://www.cs.cmu.edu/~bstephe1/eiquadprog.hpp;或尝试使用相同算法的另一种实现方式(也基于Eigen)https://github.com/asherikov/qpmad

答案 1 :(得分:0)

如果您的using namespace quadprogpp;,则不要。您不同的库具有相同的类型名,多数民众赞成在导致您有错误。键入quadprogpp::someFunction();可能还需要几个字符,但值得。这也是为什么您永远不要在标头中放置using namespace的原因。这是因为您污染了所有包含该标头的文件,并带有名称空间符号和名称冲突,因此可能会导致这种错误。

Quadprog库位于它自己的名称空间中。

#if !defined(_ARRAY_HH)
#define _ARRAY_HH

#include <set>
#include <stdexcept>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>

namespace quadprogpp {

enum MType { DIAG };

template <typename T>
class Vector

请注意,在#include之后,如何命名空间Quadprogpp {}脱节,并且其括弧中定义的所有内容都将在QuadProgpp的范围内进行定义,因此要使用该库中的任何一个,必须在Eveything之前加上前缀命名空间名称。这与使用标准库中的内容没有什么不同。我很确定您已经编写了标准的c ++ hello world

#include<iostream>
int main()
{
  std::cout << "hello world!" << std::endl;
  return 0;
}

cout和endl是命名空间std的一部分,必须以std ::为前缀才能访问它们。许多使用C ++的新程序员都不喜欢这样做,而他们用Google搜寻的第一件事就是如何不必输入名称空间。

#include<iostream>

using namespace std;
int main()
{
  cout << "hello world" << endl;
  return 0;
}

新程序员经常要做的下一件事是学习将其定义放在头文件中,并将其程序逻辑放在cpp文件中。那就是当他们犯下一个常见错误时。

#ifndef MYHEADER
#define MYHEADER
#include<string>
#include<vector>
#include<iostream>

using namespace std; //Never do this in a header. 

这样做会污染标准库中所有内容的所有代码。这看似微不足道,但是当您开始使用另一个库或创建自己的类型时,该类型与导致名称冲突的标准库中的名称相同。

那是编译器根本无法说明您想要哪个Vector的时候。但是Quadprog ++中的Quadprog.hh和Array.hh都包装在名称空间quadprogpp中,以专门防止名称冲突,这是名称空间的全部目的。因此,您的代码中存在某个地方,可能是一个头文件,您在其中声明了using namespace quadprogpp;或其他一些定义了Array类型的名称空间,并且编译器无法推断出您引用的类型您的代码。

除了删除正在使用的名称空间语句之外,还可以在类型名称前添加名称空间限定符,以消除所讨论的类型的歧义。就您而言,我相信您的Array应该声明为quadprogpp::Array arraynamme;而不是简单的Array arrayname;