2016-06-16 11 views
-3

私は、次の質問を持っている:パスの一般的な機能

私はそれが動作しない別のものにテンプレート関数を渡すが、私はテンプレート関数に、通常の1を渡すとき、それは例えば、通常のコンパイル

template<class It, class Pred> 
It findif(It begin,It end, Pred pr){ 
    while (begin!=end && !pr(*begin)) 
     begin++; 
    return begin; 
} 
bool p(const string& s){ 
    /* some code */ 
} 

私はそれが動作するfindif Pを渡すが、これはしません:

template<class It, class Pred> 
It findif(It begin,It end, Pred pr){ 
    while (begin!=end && !pr(*begin)) 
     begin++; 
    return begin; 
} 
template<class T 
bool p(const T& s){ 
    /* some code */ 
} 
+3

どのように渡しますか?どのようなエラーが出ますか? – NathanOliver

+0

おそらく、インスタンス化されていないテンプレートをalgoに渡そうとしています。あなたはそれを行うことはできません、テンプレートは呼び出し可能なオブジェクトではありません。 C++には汎用関数もありません。 – SergeyA

+0

@ NathanOliver <未解決のオーバーロードされた関数> –

答えて

1

テンプレート機能は、彼らはそれ自体が機能していない機能の青写真です。コンパイラが特定のインスタンス化を生成するように、それらのインスタンスの1つをインスタンス化する必要があります。たとえば、次のようにすることはできません。

template<class It, class Pred> 
It findif(It begin,It end, Pred pr) { 
    while (begin!=end && !pr(*begin)) 
     begin++; 
    return begin; 
} 

template<class T> 
bool p(const T& s) { 
    /* some code */ 
} 

int main() { 
    std::vector<int> v{1,2,3}; 
    findif(v.begin(), v.end(), p); 
} 

コードを受け入れるには、まず関数テンプレートをインスタンス化する必要があります。テンプレートを維持し、まだテンプレート引数を推定したい場合は、その周囲の正常な方法は、ファンクタを使用することです

findif(v.begin(), v.end(), p<int>); 
          ^^^^^^ 
0

:それはあなたのようにそれに明示的に引数を提供する必要があり、ある

struct p { 
    template<class T> 
    bool operator()(const T& s) const { /*...*/ } 
}; 

// ... 

findif(v.begin(), v.end(), p{}); 
関連する問題