2017-05-26 30 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)考慮使用lambda:'[](imt i){return i> = 40; }'b)'std :: vector myvector v = {10,25,...,5};' – Borgleader

回答

-1

您的示例中存在一些問題。第一個是std::find_if與非靜態成員方法指針不兼容。這些指針需要this才能工作。由於UserInterface::Number不能訪問任何非靜態成員,也不會調用任何非靜態方法,因此可以將其靜態化。

第二個問題是,您必須使用&來獲取指向您的函數的指針。

最後,不要忘記typename之前std::vector<T>::iterator

#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' ...沒辦法某人「新的C++」應該與此搏鬥。 –

+0

@在OP問及爲什麼他的代碼不能編譯。這是缺少的。在問題*中甚至提到'typename'作爲嘗試的解決方案。 –

+0

@ xnn:新對你來說意味着什麼?我會考慮一些仍在學習如何正確編寫模板的新手。 –