0

这是我在这里的第一个问题,我已经搜索了很长时间,但没有解决方案。我正在使用 QUAdprog++ 来解决二次问题。当我单独在测试中使用它时,还可以。但是当我将它实现到包含 Eigen 的项目中时,Eigen 操作将出现错误,例如“矩阵 A 没有名为 'lu_inverse' 的成员”。如果我将 Quadprog++(Array.hh 和 Quadprog++.hh)的头文件注释掉,错误就会消失。所以我认为这是 Eigen 和 Quadprog++ 的头文件之间的冲突错误。有人有线索吗?提前致谢!

4

2 回答 2

1

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

于 2018-11-21T18:54:10.450 回答
0

如果你using namespace quadprogpp;那么不。您的不同库具有相同的类型名称,这会导致您遇到的错误。可能需要输入更多字符,quadprogpp::someFunction();但值得。这也是为什么你永远不应该using namespace在标题中放入 a 的原因。这是因为您使用名称空间符号污染了所有包含该标头的文件,并且可能会出现名称冲突,这与您现在遇到的错误相同。

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 之后,命名空间quadprogpp{} 是如何被取消的,并且在其封闭括号中定义的所有内容都将在quadprogpp 的范围内定义,因此要使用此库中的任何内容,您必须在所有内容前加上命名空间名称。这与使用标准库中的东西没有什么不同。我很确定您已经编写了标准的 c++ hello world

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

cout 和 endl 作为命名空间 std 的一部分必须以 std:: 为前缀才能访问它们。许多 C++ 新程序员不喜欢这一点,他们谷歌的第一件事就是如何不必输入命名空间。

#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 类型的命名空间,编译器无法推断出您在代码中引用的类型。

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

于 2018-11-20T05:19:48.383 回答