Ошибки компиляции C ++ при использовании Quadprog ++ вместе с Eigen - PullRequest
0 голосов
/ 20 ноября 2018

это мой первый вопрос, я долго его искал, но пока не нашел решения.Я использую QUadprog ++ для решения квадратичной задачи.Когда я использую его в одном тесте, все было в порядке.Но когда я внедряю его в свой проект, который содержит Eigen, операции Eigen будут иметь ошибки типа «Матрица A не имеет члена с именем« lu_inverse »».Если я закомментирую заголовочные файлы Quadprog ++ (Array.hh и Quadprog ++. Hh), ошибки просто исчезнут.Поэтому я предполагаю, что это была ошибка конфликта между заголовочными файлами Eigen и Quadprog ++У кого-нибудь есть подсказка?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Вы также можете переключиться на одну из версий QuadProgpp, которая может работать с типами Eigen напрямую: https://github.com/asherikov/QuadProgpp, https://www.cs.cmu.edu/~bstephe1/eiquadprog.hpp; или попробовать альтернативную реализацию того же алгоритма (также на основе Eigen) https://github.com/asherikov/qpmad.

0 голосов
/ 20 ноября 2018

если ваш 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, поэтому, чтобы использовать любую из этой библиотеки, вы должны ставить префикс перед всеми имя пространства имен. это ничем не отличается от использования вещей из стандартной библиотеки. Я совершенно уверен, что вы написали стандартный привет C ++ 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.hh, и Array.hh в Quadprog ++ обернуты в пространство имен quadprogpp, чтобы специально предотвратить конфликт имен, что и является целевым назначением пространств имен. Таким образом, в вашем коде есть где-то, вероятно, заголовочный файл, где вы сделали оператор using namespace quadprogpp;, или какое-то другое пространство имен, определяющее тип Array, и компилятор не может определить, какой тип вы ссылаетесь в своем коде. ,

Кроме удаления операторов использования пространства имен, вы также можете добавить префикс typename с его квалификатором пространства имен, чтобы определить, какой тип вы говорите. В вашем случае я уверен, что ваш массив должен быть объявлен как quadprogpp::Array arraynamme;, а не просто Array arrayname;

...