- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
为什么不能编译?
#include <functional>
#include <boost/function.hpp>
class A {
A() {
typedef boost::function<void ()> FunctionCall;
FunctionCall f = std::bind1st(std::mem_fun(&A::process), this);
}
void process() {}
};
错误:
In file included from /opt/local/include/gcc44/c++/bits/stl_function.h:712,
from /opt/local/include/gcc44/c++/functional:50,
from a.cc:1:
/opt/local/include/gcc44/c++/backward/binders.h: In instantiation of 'std::binder1st<std::mem_fun_t<void, A> >':
a.cc:7: instantiated from here
/opt/local/include/gcc44/c++/backward/binders.h:100: error: no type named 'second_argument_type' in 'class std::mem_fun_t<void, A>'
/opt/local/include/gcc44/c++/backward/binders.h:103: error: no type named 'first_argument_type' in 'class std::mem_fun_t<void, A>'
/opt/local/include/gcc44/c++/backward/binders.h:106: error: no type named 'first_argument_type' in 'class std::mem_fun_t<void, A>'
/opt/local/include/gcc44/c++/backward/binders.h:111: error: no type named 'second_argument_type' in 'class std::mem_fun_t<void, A>'
/opt/local/include/gcc44/c++/backward/binders.h:117: error: no type named 'second_argument_type' in 'class std::mem_fun_t<void, A>'
/opt/local/include/gcc44/c++/backward/binders.h: In function 'std::binder1st<_Operation> std::bind1st(const _Operation&, const _Tp&) [with _Operation = std::mem_fun_t<void, A>, _Tp = A*]':
a.cc:7: instantiated from here
/opt/local/include/gcc44/c++/backward/binders.h:126: error: no type named 'first_argument_type' in 'class std::mem_fun_t<void, A>'
In file included from /opt/local/include/boost/function/detail/maybe_include.hpp:13,
from /opt/local/include/boost/function/detail/function_iterate.hpp:14,
from /opt/local/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:47,
from /opt/local/include/boost/function.hpp:64,
from a.cc:2:
/opt/local/include/boost/function/function_template.hpp: In static member function 'static void boost::detail::function::void_function_obj_invoker0<FunctionObj, R>::invoke(boost::detail::function::function_buffer&) [with FunctionObj = std::binder1st<std::mem_fun_t<void, A> >, R = void]':
/opt/local/include/boost/function/function_template.hpp:913: instantiated from 'void boost::function0<R>::assign_to(Functor) [with Functor = std::binder1st<std::mem_fun_t<void, A> >, R = void]'
/opt/local/include/boost/function/function_template.hpp:722: instantiated from 'boost::function0<R>::function0(Functor, typename boost::enable_if_c<boost::type_traits::ice_not::value, int>::type) [with Functor = std::binder1st<std::mem_fun_t<void, A> >, R = void]'
/opt/local/include/boost/function/function_template.hpp:1064: instantiated from 'boost::function<R()>::function(Functor, typename boost::enable_if_c<boost::type_traits::ice_not::value, int>::type) [with Functor = std::binder1st<std::mem_fun_t<void, A> >, R = void]'
a.cc:7: instantiated from here
/opt/local/include/boost/function/function_template.hpp:153: error: no match for call to '(std::binder1st<std::mem_fun_t<void, A> >) ()'
最佳答案
因为 bind1st
需要一个二元函数对象。但是,您传递了一个一元函数对象。 C++03 的函数对象绑定(bind)器不像 boost 或 tr1 中的那样复杂。事实上,它们存在一些基本问题,比如无法处理带有引用参数的函数。
既然你已经使用了boost,我推荐使用boost::bind
FunctionCall f = boost::bind(&A::process, this); // yay!
关于c++ - 功能性、bind1st 和 mem_fun,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2917168/
我正在尝试用 Gtkmm3 制作一个简单的软件。 我想要一个里面有网格的窗口。单击该网格内的按钮时,应触发窗口的一种方法以删除当前网格并将其替换为另一个网格。 我可以使用这样的网格方法: button
我在 Visual Studio 2013 Professional 中使用 CryEngine2 SDK 构建的每个项目中遇到此错误已有一段时间了。大多数时候,我只是从这个编辑函数: void CM
假设指定注释中的实例化正确,以下表达式是否合法且可移植 C++?为什么或为什么不? std::mem_fun(&(std::vector::clear)) 最佳答案 如其所写,使用一组空的模板参数,不
我想在运行时设置函数指针。但我被困在这里。当我使用全局函数或静态类成员函数时,一切正常。但是,当函数是普通的类成员函数时。我总是遇到编译器错误。这是代码: class A { int va
我实际上已经想出了如何按照我的问题标题建议的那样做,但不是以令人满意和便携的方式。让我说得更具体一些。 这是我的代码的精简和修改版本: #include #include class A { pu
有没有办法创建一个vector > ? 我看到的错误是: error C2512: 'std::mem_fun1_t' : no appropriate default constructor ava
我最近决定将指针 vector 更改为智能指针 vector ,但尽管这些智能指针与 STL 兼容,但我无法转换某些算法来使用它们。 考虑一个 class Base { ... v
考虑这个例子(https://ideone.com/RpFRTZ) 这将有效调用 Foo::comp (const Foo& a)带有不相关类型的参数 Bar .如果我注释掉 std::cout #
我正在尝试使用 boost:function 类。在下面的示例中,foo() 调用一切正常,但如果我想对 sum() 函数执行相同的操作,gcc 编译器会提示这一行: _f2 = std::bind1
在 gtkmm 中,我可以在构造函数中使用类似这样的东西: // Gtk::ImageMenuItem *iQuit; iQuit->signal_activate().connect (sigc::
我正在使用 C++98。 我有以下代码: #include #include #include struct Foo {}; void add_each(std::vector > &vv, c
为什么不能编译? #include #include class A { A() { typedef boost::function FunctionCall;
我想知道是否可以使用 std::mem_fun 传递参数?我想准确地说,我可以有尽可能多的参数和很多成员函数。 问题是我使用的是旧标准,我正在寻找一种完整的 STL 方式,因此即使我知道我可以轻松做到
假设我有这样的层次结构(这只是一个测试程序。请不要指出与内存泄漏、析构函数不是虚拟等相关的任何内容): class I { public: virtual void fun(int n, in
我正在上课: class A { public: // ctr and etc ... A* clone(B* container); }; 现在,我有一个 vector availableObj
首先,我有一个片段如下: struct D { int sum; D():sum(0){accum();} void incre(int arg){sum+=arg;} void ac
mem_fun 和 mem_fun_ref 以及许多其他成员函数适配器可以使成员函数像普通函数一样工作。但是有一个限制,他们调用的成员函数必须是const 成员函数。我开始知道如何使用它们,但对背后的
pthread 接受它的参数 void *(*start_routine)(void* userPtr),我希望我可以使用 std::mem_fun 来解决我的问题,但我做不到。 我想使用函数 voi
我有一个 C++ 类,我在其中尝试使用 std::bind1st 将成员函数绑定(bind)到“this”参数。例如: class MyClass { public: void Foo()
有没有办法在 boost multi_index_container 的 composite_key 规范中使用成员函数? #include #include #include #include
我是一名优秀的程序员,十分优秀!