2017-05-26 13 views
0

私はC++で新しく、テンプレートでfind_ifを使用しようとしていますが、私が望むように動作しないようです。何故ですか?私はイテレータでテンプレートに関する以前の質問に答えを見つけようとしましたが、私は正しいものを見逃してしまったり、答えを正しく理解できなかったと思います。イテレータの前にtypenameを使用しようとしましたが、エラーメッセージは変更されませんでした。テンプレートを使用したfind_if()?

これを行うより良い方法はありますか?その場合、誰かが私にこれを行う方法を教えてもらえますか?

(エラーメッセージ:エラーC3867: 'たUserInterface ::ナンバー':関数呼び出しの欠落している引数リスト、使用 '&ユーザインタフェース::ナンバー' メンバへのポインタを作成する)=

こと私が関数呼び出しの後に逃したことは分かっていますが、今回はそうではありませんか?

#include <iostream>  // std::cout 
#include <algorithm> // std::find_if 
#include <vector>  // std::vector 

template<typename T> 
class UserInterface 
{ 
public: 
bool Number(int i); 
void function(); 
}; 

template<typename T> 
bool UserInterface<T>::Number(int i) { 
return (i >= 40); 
} 

template<typename T> 
void UserInterface<T>::function() 
{ 
std::vector<T> myvector; 

myvector.push_back(10); 
myvector.push_back(25); 
myvector.push_back(15); 
myvector.push_back(55); 
myvector.push_back(1); 
myvector.push_back(65); 
myvector.push_back(40); 
myvector.push_back(5); 

std::vector<T>::iterator it = std::find_if(myvector.begin(), myvector.end(), Number); 
std::cout << "The first value over 40 is " << *it << '\n'; 

std::cin.get(); 
} 

int main() { 
UserInterface<int> fu; 
fu.function(); 

return 0; 
} 
+0

どこに?私はそれを試みたと思ったが、私はちょうど方法を理解していなかったと思う。 :) – StudentLerning

+0

Number関数を 'static'として宣言する必要があります。 – VTT

+0

A)ラムダの使用を検討してください: '[](imt i){return i> = 40; } 'B)' std :: vector myvector v = {10、25、...、5}; ' – Borgleader

答えて

-1

例にはいくつか問題があります。 1つは、std::find_ifが非静的メンバーメソッドポインタと互換性がないことです。これらのポインタにはthisが必要です。 UserInterface::Numberは非静的メンバーにはアクセスせず、非静的メソッドも呼び出さないため、静的メンバーにすることができます。

第2の問題は、&を使用して関数へのポインタを取得する必要があることです。

最後に、std::vector<T>::iteratorの前にtypenameを忘れないでください。

#include <iostream>  // std::cout 
#include <algorithm> // std::find_if 
#include <vector>  // std::vector 

template<typename T> 
class UserInterface 
{ 
public: 
    static bool Number(int i); 
// ^^^^^^ Add static here 
    void function(); 
}; 

template<typename T> 
bool UserInterface<T>::Number(int i) { 
    return (i >= 40); 
} 

template<typename T> 
void UserInterface<T>::function() 
{ 
    std::vector<T> myvector; 

    myvector.push_back(10); 
    myvector.push_back(25); 
    myvector.push_back(15); 
    myvector.push_back(55); 
    myvector.push_back(1); 
    myvector.push_back(65); 
    myvector.push_back(40); 
    myvector.push_back(5); 

    typename std::vector<T>::iterator it = 
// ^^^^^^^^ typename here 
    std::find_if(myvector.begin(), myvector.end(), &Number);            
//            ^
    std::cout << "The first value over 40 is " << *it << '\n'; 

    std::cin.get(); 
} 

int main() { 
    UserInterface<int> fu; 
    fu.function(); 

    return 0; 
} 
+0

'typename' ...誰かが" new at C++ "と言うのはこれとは関係ありません。 –

+0

@ OPは彼のコードがコンパイルされない理由を尋ねました。これは欠けているものです。 'typename'は解決策として*の質問でさえ*言及されています。 –

+0

@ñаn:新しい意味は何ですか?私はまだ新しいテンプレートを書く方法を学んでいる人を考えています。 –

関連する問題