это мой первый вопрос, я его долго искал, но пока не нашел решения.
Я использую QUadprog ++ для решения квадратичной задачи. Когда я использую его в одном тесте, все было в порядке. Но когда я внедряю его в свой проект, который содержит Eigen, операции Eigen будут иметь ошибки типа «Матрица A не имеет члена с именем« lu_inverse »». Если я закомментирую заголовочные файлы Quadprog ++ (Array.hh и Quadprog ++. Hh), ошибки просто исчезнут. Поэтому я предполагаю, что это была ошибка конфликта между заголовочными файлами Eigen и Quadprog ++. У кого-нибудь есть подсказка? Заранее спасибо!
если твой 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;
Вы также можете переключиться на одну из версий QuadProgpp, которая может работать непосредственно с типами Eigen: https://github.com/asherikov/QuadProgpp, https://www.cs.cmu.edu/~bstephe1/eiquadprog.hpp; или попробуйте альтернативную реализацию того же алгоритма (также на основе Eigen) https://github.com/asherikov/qpmad.