首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一起使用带特征的C++时的Quadprog++合成误差

一起使用带特征的C++时的Quadprog++合成误差
EN

Stack Overflow用户
提问于 2018-11-20 04:03:02
回答 2查看 452关注 0票数 0

这是我在这里的第一个问题,我已经搜索了很长一段时间了,但还没有解决办法。我用QUadprog++来解决二次问题。当我单独在测试中使用它时,它是没有问题的。但是,当我将其实现到包含本征的项目中时,本征操作将出现“矩阵A没有名为‘lu_inverse’的成员”之类的错误。如果我将Quadprog++ (Array.hh和Quadprog++.hh)的头文件注释掉,错误就会消失。因此,我假设这是特征文件和Quadprog++的头文件之间的冲突错误。有人有线索吗?提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-20 05:19:48

如果你的using namespace quadprogpp;,那就不。您的不同库具有相同的类型名,这将导致您所拥有的错误。输入quadprogpp::someFunction();可能还需要几个字符,但这是值得的。这也是为什么你永远不应该把一个using namespace放在头上。这是因为您污染了包含该标题的所有文件,其中包含名称空间符号和名称冲突,这与您现在拥有的错误是相同的。

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

代码语言:javascript
复制
#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

请注意,在该#包含名称空间四边形{}的解密之后,其括起来括号中定义的所有内容都将在作用域中定义为四边形,因此要使用该库中的任何一个,都必须以名称空间名称作为前缀。这与使用标准库中的东西没有什么不同。我敢肯定你已经写好了标准的c++ hello world

代码语言:javascript
复制
#include<iostream>
int main()
{
  std::cout << "hello world!" << std::endl;
  return 0;
}

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

代码语言:javascript
复制
#include<iostream>

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

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

代码语言:javascript
复制
#ifndef MYHEADER
#define MYHEADER
#include<string>
#include<vector>
#include<iostream>

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

这样做会污染标准库中的所有代码。这似乎是一件微不足道的事情,但当您开始使用另一个库时,或者您创建了自己的类型,其名称与标准库中导致名称冲突的事物具有相同的名称。

在这种情况下,编译器根本无法解释您想要哪个向量。但是,Quadprog.hh和Array.hh在Quadprog++中都被包装在名称空间四边形中,以专门防止名称冲突,这就是名称空间的全部目的。因此,在代码中的某个地方,可能是头文件,您已经做了using namespace quadprogpp;语句,或者定义了数组类型的其他名称空间,编译器无法推断代码中引用的是哪种类型。

除了删除使用的命名空间语句之外,您还可以在typename前面加上其名称空间质权器,以消除您所谈论的类型的歧义。在您的例子中,我确信您的数组应该声明为quadprogpp::Array arraynamme;而不是简单的Array arrayname;

票数 0
EN

Stack Overflow用户

发布于 2018-11-21 18:54:10

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53386048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档