2010-12-09 122 views
3

教育目的我試圖寫我自己 「的ForEach」 功能:傳遞一個函數指針作爲模板參數

#include <iostream> 
#include <string> 
#include <vector> 


// 
// This works 
// 
template<class Container> 
void ForEach_v1(const Container & inContainer, void (*Functor)(const std::string &)) 
{ 
    typename Container::const_iterator it = inContainer.begin(), end = inContainer.end(); 
    for (; it != end; ++it) 
    { 
     Functor(*it); 
    } 
} 


// 
// Does not work 
// 
template<class Container, class Functor> 
void ForEach_v2(const Container & inContainer, Functor inFunctor) 
{ 
    typename Container::const_iterator it = inContainer.begin(), end = inContainer.end(); 
    for (; it != end; ++it) 
    { 
     Functor(*it); 
    } 
} 

void PrintWord(const std::string & inMessage) 
{ 
    std::cout << inMessage << std::endl; 
} 

int main() 
{ 
    std::vector<std::string> words; 
    words.push_back("one"); 
    words.push_back("two"); 
    words.push_back("three"); 

    // Works fine. 
    std::cout << "v1" << std::endl; 
    ForEach_v1(words, PrintWord); 

    // Doesn't work. 
    std::cout << "v2" << std::endl; 
    ForEach_v2(words, PrintWord); 

    return 0; 
} 

編譯器輸出:

|| g++ -Wall -o test main.cpp 
|| main.cpp: In function 'void ForEach_v2(const Container&, Functor) [with Container = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, Functor = void (*)(const std::string&)]': 
main.cpp|116| instantiated from here 
main.cpp|96| warning: unused variable 'it' 

程序輸出:

v1 
one 
two 
three 
v2 

我的問題:

  • 爲什麼ForEach_v2什麼不打印?
  • 爲什麼編譯器打印「未使用的變量」 - 注意ForEach_v2

回答

8

你想

inFunctor(*it); 

Functor(*it); 
+1

尷尬... – StackedCrooked 2010-12-09 19:54:56

3
template<class Container, class Functor> 
void ForEach_v2(const Container & inContainer, Functor inFunctor) 
{ 
    typename Container::const_iterator it = inContainer.begin(), end = inContainer.end(); 
    for (; it != end; ++it) 
    { 
     Functor(*it); 
    } 
} 

應該是

template<class Container, class Functor> 
void ForEach_v2(const Container & inContainer, Functor inFunctor) 
{ 
    typename Container::const_iterator it = inContainer.begin(), end = inContainer.end(); 
    for (; it != end; ++it) 
    { 
     inFunctor(*it); 
    } 
} 
2

這裏是你的問題:

for (; it != end; ++it) 
    { 
     Functor(*it); 
    } 

Functor現在是功能你傳遞的類型。

你需要這樣寫:

for (; it != end; ++it) 
    { 
     inFunctor(*it); //note this change! 
    } 

現在,這將工作!

相關問題