我只是在试用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);
}
答案 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)
:
从数据成员foo
和foo1
的声明中可以看出,这两者有不同的类型:
foo
属于void (Functortest::*)()
类型,即foo
是指向类Functortest
的成员函数的指针,它不带参数和什么都不返回。它与指向类test1
的特定成员函数Functortest
的指针的类型相同。
foo1
属于void (Functortest::*)(std::string)
类型,即foo1
是指向类Functortest
的成员函数的指针,其参数为输入std::string
并且不返回任何内容。它与指向类test2
的特定成员函数Functortest
的指针的类型相同。
不能使用参数调用不带参数的函数(平凡),类似地,不能使用参数调用具有参数的函数。因此,foo
和foo1
的类型不兼容。出于同样的原因,您不能将指向Functortest::test1
的指针分配给指向成员函数[...]的指针,该成员函数[...]采用std::string
类型的参数。