2010-12-19 7 views
0
template <int p>  
bool FComapare (Node *lId, Node* rId)  
{  
    if(lId->getDiff(p) < rId->getDiff(p)) 
     return true; 
    else if(lId->getDiff(p) == rId->getDiff(p)) 
    { 
     if(lId->getLT() < rId->getLT()) 
      return true; 
     else if(lId->getLT() == rId->getLT()) 
      return (lId->getTFG() < rId->getTFG()); 
    } 
    return false; 
} 

vector<set<Node*, bool (*)(Node*,Node*) > > m_F; 

for (int i = 0;i < partNum; ++i) 
{ 
    //This doesn`t workbecause of const problem... 
    set<Node *, bool (*)(Node*,Node*) > f(&FComapare<i>); 
    m_F.push_back(f); 
} 

私は次のようなエラーにテンプレートメタプログラミングの問題

error C2664: 'std::set<_Kty,_Pr>::set(bool (__cdecl *const &)(Node *,Node *))' : cannot convert parameter 1 from 'bool (__cdecl *)(Node *,Node *)' to 'bool (__cdecl *const &)(Node *,Node *)' 1> with 1> [ 1>
_Kty=Node *, 1> _Pr=bool (__cdecl *)(Node *,Node *) 1> ] Reason: cannot convert from 'overloaded-function' to 'bool (__cdecl *const)(Node *,Node *)' 1>
None of the functions with this name in scope match the target type

どのように問題を解決し、同じ機能を得ることができますを取得していますか? はどうすれば

+2

「どのように問題を解決して同じ機能を利用できますか?」 - どのような機能ですか?まず最初にどのような機能を望んでいるのか忘れてしまいました。ここで何を達成しようとしていますか? –

答えて

3

非型引数に変数を使用することはできません。

テンプレート関数の代わりに、iの値を格納する関数オブジェクトを試してください。

class FCompare 
{ 
    int p; 
public: 
    FCompare(int p): p(p) {} 
    bool operator()(const Node *lId, const Node* rId) const {...} 
}; 

set<Node *, FCompare > f((FCompare(i))); 
+0

set コンパイルしません – Yakov

+0

ベクトル> m_F; どうすれば設定を正しく定義できますか? – Yakov

+1

ええ、それは動作します(少なくともg ++で):http://www.ideone.com/3yunr –

2

テンプレートパラメータはコンパイル時に知られている必要があります正しく

vector<set<Node*, bool (*)(Node*,Node*) > > m_F; 

感謝を定義します。 あなたのケースでは、間違っているテンプレート関数をインスタンス化するためにローカル変数を使用しようとしています。

FComapare()と同じ働きをし、pをクラスメンバとして格納するoperator()でクラスを作成するだけで、テンプレートを使用しないことをお勧めします。

1

テンプレート引数はコンパイル時に知る必要があります。ランタイム値をテンプレート引数として使用することはできません。

この場合、pがテンプレートパラメータである必要があるわけではないので、これは問題ありません。あなたはFCompareのロジックをpをメンバー変数として持つクラスのoperator()に入れ、そのクラスのインスタンスをsetのコンストラクタの引数として渡すだけです。

+0

この場合、m_Fをどのように定義できますか? – Yakov

関連する問題