如何将仿函数和函数指针一起使用?无法将功能分配给功能指针

时间:2014-03-02 21:40:46

标签: c++11

我只是在试用c ++ 11。我想在同一个程序中演示函子和函数指针,但我不断得到一个error.how一起使用函子和函数指针?无法将功能分配给功能指针。无法将函数test1和test2分配给函数指针foo 无法将Functortest *分配给void *是我得到的错误。我该怎么办,为什么我无法将函数分配给函数指针foo和foo1

 #include<iostream>
 #include<string>
 using namespace std;



 class Functortest{

 public:
     Functortest(){
         //foo=void(*)();

         //void(*foo1)(string);
     }
     void operator()(int option){
         switch (option){
         case 1: 
             void(*foo)();
             foo=test1;
             break;
         case 2:
             void(*foo1)();
             foo = test2;
         }

     };
     void test1(){

         cout << "TEST1 CALLED";
     }
     void test2(string msg){

         cout << "TEST2 CALLED msg:  "<< msg;
     }
 private:
     void *foo;
     void *foo1;
     /*void(*foo)();
     void(*foo1)(string);*/
 };

 void main(){

     Functortest funct;
     funct(1);
     funct(2);
 }

1 个答案:

答案 0 :(得分:3)

The parashift C++ FAQ包含有关如何使用成员函数指针的一些信息。

#include<iostream>
#include<string>
//using namespace std; // <-- better avoid `using namespace` at file scope


class Functortest {
public:
    Functortest()
        : foo(&Functortest::test1)   // better use the mem-initializer-list
        , foo1(&Functortest::test2)  // to initialize members
    {}

    void operator()(int option){
        switch (option){
        case 1: 
            (this->*foo)();
            foo = &Functortest::test1;    // after the call?
            break;
        case 2:
            (this->*foo1)("Hello World"); // need to pass an argument
            //foo = &Functortest::test2;  // <-- this won't work! (A)
            break;                        // better always end with a break
        }
    };

    void test1() {
         std::cout << "TEST1 CALLED\n";
    }
    void test2(std::string msg) {
         std::cout << "TEST2 CALLED msg: " << msg << "\n";
    }

private:
    void (Functortest::*foo)();             // declares a data member foo
    void (Functortest::*foo1)(std::string); // declares a data member foo1
};

int main() {             // NOT `void main`
    Functortest funct;
    funct(1);
    funct(2);
}

在评论// <-- this won't work! (A)

的行上

从数据成员foofoo1的声明中可以看出,这两者有不同的类型:

  • foo属于void (Functortest::*)()类型,即foo是指向类Functortest的成员函数的指针,它不带参数和什么都不返回。它与指向类test1的特定成员函数Functortest的指针的类型相同。

  • foo1属于void (Functortest::*)(std::string)类型,即foo1是指向类Functortest的成员函数的指针,其参数为输入std::string并且不返回任何内容。它与指向类test2的特定成员函数Functortest的指针的类型相同。

不能使用参数调用不带参数的函数(平凡),类似地,不能使用参数调用具有参数的函数。因此,foofoo1的类型不兼容。出于同样的原因,您不能将指向Functortest::test1的指针分配给指向成员函数[...]的指针,该成员函数[...]采用std::string 类型的参数。