Ошибки компиляции C ++ при использовании Quadprog ++ вместе с Eigen

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

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 ++

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

cout и endl, являющиеся частью пространства имен std, должны иметь префикс std :: для доступа к ним. Многим новым программистам на С ++ это не нравится, и одна из первых вещей, которые они ищут в 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;

0

Другие решения

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

0

По вопросам рекламы [email protected]