2010-12-09 119 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! 
    } 

现在,这将工作!

相关问题