2016-12-19 64 views
1

私のコードは以下の通りです:    私は関数ポインタを使ってテンプレートクラスオブジェクトを作成します。  なぜこれを行うのですか?ComparatorクラスLessはメンバ関数を使用して結果を表示します。ただし、operator()でクラスを定義すると、内部クラスが外部クラスの非静的メンバーにアクセスできないというエラーが発生します。だから私はテンプレートの引数を作るために関数を使うだろう。関数ポインタを使ったC++テンプレート引数

#include <iostream> 
using namespace std; 

template <typename Comp> 
class Compare{ 
private: 
    int a[10]{1,2,3,4,5,6,7,8,9,0}; 
public: 
// class Less{ //use inner class, can't visit the member function in OuterClass like java. so we'd use a function pointer to initialize the template 
//  public: 
//   
// }; 
    bool Less(int v1, int v2){ 
     return a[v1] < a[v2]; 
    } 
private: 
    Comp comp; 
public: 
    void compare(int v1, int v2){ 
     cout << comp(v1, v2); 
    } 
}; 

int main() 
{ 
    Compare<&Compare::Less> c; 
    c.compare(1, 2);  
} 

しかし、私はエラーが好きだ、次のとおりです。

In function 'int main()': 
[Error] template argument 1 is invalid 
[Error] invalid type in declaration before ';' token 
[Error] request for member 'compare' in 'c', which is of non-class type 'int' 

は本当に理由を知りたいです。 Thx!:)

+1

からインスピレーションを描画することをお勧めアルゴリズム実装については

、私が言う:バックステップを取り、テキストブックにクラステンプレートと関数テンプレートの基礎を経ます。この特定の問題に対する答えを得ることは、長期的にはあなたを助けません。最初に基礎を構築する必要があります。 –

答えて

0

functorを使用してこれを行う簡単な方法は、演算子()をオーバーロードしてプライベートメンバーとしてファンクタ内に配置し、このファンクタをmainそれ:

#include <iostream> 
using namespace std; 

class Comparator{ 
private: 
    int a[10]{1,2,3,4,5,6,7,8,9,0}; 
public: 
    bool operator()(int v1, int v2) const{ 
     return a[v1] < a[v2]; 
    } 
}; 


int main(){ 
    Comparator less; 
    cout<<less(1,2)<<endl; 
} 

あなたはダイクストラアルゴリズムのためのコンパレータを記述する場合、民間メンバーはだけではなく、あなたが定義したmin_heapに配列やベクトルを渡す)(演算子をオーバーロードとして、uは配列せずに、簡単な関数ポインタを定義する必要があり、同様のアプローチはstd :: priority_queueにあります。

template<class Comparable> 
    Comparator<Comparable> comp; 
    std::priority_queue<Comparable, vector<Comparable>, Comparator<Comparable>> pq(comp,a); 

希望します。

+0

メンバーのオペレータは 'const'のほうが良いでしょうか? – xtofl

+0

@xtoflあなたは正しいです!ありがとう。 –

0

理由:テンプレートは種類を期待に対し

&Compare::Less 

は、タイプではありません。値はbool (Compare::*)(int, int)です。安全にdecltype(&Compare::Less)を使用できます。

デザイン:

デザインは壊れやすいと思われるので、テンプレートの問題はおそらく解決するための権利の問題ではありません。

また、私は何を@ R.Sahuは、基本を再訪しようとしました。私はあなたがしようとしたコードから判断boost.graph

+0

はい。私はdijkstraアルゴリズムを書こうとしています。それは私の自己によって書かれたMinHeapを使用します。 MinHeapはこれについてです: – wind2412

+0

@ wind2412、私はそれを書いたことはありませんが、あなたが示したコードがアルゴリズムとどのように関係しているかわかりません。 – Incomputable

+0

申し訳ありませんが、私は私の執筆を完了していませんし、それを送信...はい。私はdijkstraアルゴリズムを書こうとしています。それは私の自己によって書かれたMinHeapを使用します。 MinHeapはこれに関する:MinHeap 。 2番目の引数はコンパレータです。しかし、私はdijkstraを書くとき、私は質問の配列のようなメンバ変数を使用する必要があります...しかし、コンパレータはメンバ変数を持つことができませんでした。私は配列を使用するためにメンバ関数を使用することができます...だから今の状態になります。しかし、私の条件のようにテンプレート引数に関数ポインタを渡したいのであれば、どうしたらよいですか?ありがとう! – wind2412

関連する問題