Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模板和函数指针混淆 我现在开始学习C++。我对这个定义很困惑。这只是一个一次性的代码,因为实际的实现在我正在阅读的书中 class A { public: template<class T> void Hello(void(T::*func)()) { func(); // Not working. Error term does not evaluate to function taking 0 argument } }; class B { public: void funcA() { std::cout << "Hello world" << std::endl; } // This is called function pointers void funcB(void(*ptr)()) { ptr(); } }; void main() { A a; a.Hello(&B::funcA); } A类 { 公众: 模板 void你好(void(T::*func)() { func();//不工作。错误项不计算为带0参数的函数 } }; B类 { 公众: void funcA() { 标准::cout_C++_Templates_C++11 - Fatal编程技术网

模板和函数指针混淆 我现在开始学习C++。我对这个定义很困惑。这只是一个一次性的代码,因为实际的实现在我正在阅读的书中 class A { public: template<class T> void Hello(void(T::*func)()) { func(); // Not working. Error term does not evaluate to function taking 0 argument } }; class B { public: void funcA() { std::cout << "Hello world" << std::endl; } // This is called function pointers void funcB(void(*ptr)()) { ptr(); } }; void main() { A a; a.Hello(&B::funcA); } A类 { 公众: 模板 void你好(void(T::*func)() { func();//不工作。错误项不计算为带0参数的函数 } }; B类 { 公众: void funcA() { 标准::cout

模板和函数指针混淆 我现在开始学习C++。我对这个定义很困惑。这只是一个一次性的代码,因为实际的实现在我正在阅读的书中 class A { public: template<class T> void Hello(void(T::*func)()) { func(); // Not working. Error term does not evaluate to function taking 0 argument } }; class B { public: void funcA() { std::cout << "Hello world" << std::endl; } // This is called function pointers void funcB(void(*ptr)()) { ptr(); } }; void main() { A a; a.Hello(&B::funcA); } A类 { 公众: 模板 void你好(void(T::*func)() { func();//不工作。错误项不计算为带0参数的函数 } }; B类 { 公众: void funcA() { 标准::cout,c++,templates,c++11,C++,Templates,C++11,首先,这是什么样的模板?如果是模板类,我不应该删除类a顶部的模板吗 你好 还有,为什么我不能像调用函数指针一样调用Hello()上的func 因为Hello的参数func不是函数指针,而是成员函数指针。您需要一个对象来调用它。例如 template<class T> void Hello(void(T::*func)()) { T t; (t.*func)(); } 模板 void你好(void(T::*func)() { T; (t.*func)(); } 你只

首先,这是什么样的模板?如果是模板类,我不应该删除类a顶部的模板吗

你好

还有,为什么我不能像调用函数指针一样调用Hello()上的func

因为
Hello
的参数
func
不是函数指针,而是成员函数指针。您需要一个对象来调用它。例如

template<class T>
void Hello(void(T::*func)())
{
    T t;
    (t.*func)();
}
模板
void你好(void(T::*func)()
{
T;
(t.*func)();
}

你只是在模板化
Hello
函数,带有带函数指针的签名。然后你将B的
funcA
绑定到a的
Hello
。我个人不会使用这种方法。这是哪本书?它似乎有点过时,我担心它会教你过时concepts@dau_sama我正在读一本名为SFMLG的书举例说明ame开发。这种风格过时了吗?因为这本书刚刚发行,我想几个月前。func需要取消引用,还提供了一个T:(T().*func)(;@stewbasic这只是一个混乱的代码,很难阅读。有没有办法像T()一样使用->运算符>->func cause它对我不起作用->如果需要取消引用对象而不是函数,则帮助;a->b()相当于(*a).b()。如果您使用的是C++11或更高版本,根据您尝试执行的操作,您可能会使用std::function而不是函数指针获得更可读的代码。不起作用。它表示func不是B的成员。而且intellisense在我按点时不会显示func。@hoorahoorah它与模板无关,您应该始终按It、 @hoorahoorah你试过我发布的链接了吗?
(t.*func)(;
(t().*func)();
两者都应该可以工作。完整的错误消息是什么?是的,已经试过了。只是一个简单的问题,有没有办法只使用->操作符?它也用于取消引用对吗?@HoorahHoorah
->
与指针一起使用。例如,
T*p=new T;(p->*func)(;删除p;
顺便说一句,在这种情况下你根本不需要指针。