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

C++ compilling errors when using Quadprog++ with Eigen together

这是我的第一个问题,我找了很久都没有解决办法。 我正在使用 QUadprog++ 来解决二次问题。当我单独在测试中使用它时,还可以。但是当我将它实现到我的项目中时,其中包含 Eigen,Eigen 操作将出现 "Matrix A has no member named ‘lu_inverse’" 之类的错误。如果我注释掉 Quadprog++(Array.hh 和 Quadprog++.hh)的头文件,错误就会消失。所以我假设是Eigen和Quadprog++的头文件冲突错误。有没有人有一些线索?提前致谢!

如果你 using namespace quadprogpp; 那么不要。您的不同库具有相同的类型名称,这就是导致您遇到错误的原因。可能需要输入 quadprogpp::someFunction(); 几个字符,但这是值得的。这也是为什么你不应该把 using namespace 放在 header 中。这是因为您使用命名空间符号污染了包含 header 的所有文件,并且名称冲突可能随之而来,这与您现在遇到的错误类型相同。

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

注意在#includes 之后有一个 namespace quadprogpp{} 的 declecation 并且在它的括号中定义的所有内容都将在 quadprogpp 的范围内定义,所以要使用这个库中的任何一个你必须在 everything 前面加上前缀与命名空间名称。这与使用标准库中的东西没有什么不同。我很确定你已经编写了标准的 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;
}

新程序员经常做的下一件事是学习将他们的定义放在 header 文件中,并将他们的程序逻辑放在 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 中,以专门防止名称冲突,这就是命名空间的全部目的。所以在你的代码中的某个地方,可能是一个 header 文件,你已经在其中做出了 using namespace quadprogpp; 的声明,或者其他一些定义数组类型的命名空间,并且编译器无法推断出哪种类型你在你的代码中提到的。

除了删除您的 using 命名空间语句之外,您还可以在类型名称前加上其命名空间限定词,以消除您所谈论的类型的歧义。在你的情况下,我相信你的数组应该声明为 quadprogpp::Array arraynamme; 而不是简单地 Array arrayname;

您还可以切换到可以直接使用 Eigen 类型的 QuadProgpp 版本之一:https://github.com/asherikov/QuadProgpp, https://www.cs.cmu.edu/~bstephe1/eiquadprog.hpp; or try an alternative implementation of the same algorithm (also Eigen based) https://github.com/asherikov/qpmad