0

これは私の最初の質問です。長い間ずっと検索してきましたが、解決策はありません。二次問題を解くために QUAdprog++ を使用しています。一人でテストで使ってみたら大丈夫でした。しかし、Eigen を含むプロジェクトにそれを実装すると、Eigen 操作で「Matrix A には 'lu_inverse' という名前のメンバーがありません」のようなエラーが発生します。Quadprog++ のヘッダー ファイル (Array.hh および Quadprog++.hh) をコメント アウトすると、エラーが消えます。したがって、Eigen と Quadprog++ のヘッダー ファイル間の競合エラーであると推測されます。誰も手がかりを持っていますか?前もって感謝します!

4

2 に答える 2

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;
}

名前空間 std の一部である cout と endl には、それらにアクセスするために std:: をプレフィックスとして付ける必要があります。C++ を初めて使用する多くのプログラマーはこれを嫌い、彼らが最初にググることの 1 つは、名前空間を入力する必要がない方法です。

#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;、または配列型を定義する他の名前空間があり、コンパイラはコードでどの型を参照しているかを推測できません。

using namespace ステートメントを削除する以外に、型名の前に名前空間修飾子を付けて、話している型を明確にすることもできます。あなたの場合、配列はquadprogpp::Array arraynamme;単に宣言するのではなく、次のように宣言する必要があると確信していますArray arrayname;

于 2018-11-20T05:19:48.383 に答える