用std::tr1::bind替换boost::bind出现问题
Problem replacing boost::bind with std::tr1::bind
我有以下代码,在Visual Studio 2008 SP1下编译和运行良好。
#include <functional>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/utility.hpp>
class NoncopyableObject : public boost::noncopyable
{
public:
NoncopyableObject(int x) : x_(x) {}
int getValue() const {return x_;}
private:
int x_;
};
template<class F>
class MenuItemDispatcher
{
public:
MenuItemDispatcher(F f) : f_(f) { }
void operator ()(NoncopyableObject& w) const
{
// Invoke the functor
f_(w);
}
private:
typedef boost::function1<void,NoncopyableObject&> FUNC;
FUNC f_;
};
void MenuItem()
{
std::cout << "in MenuItem()n";
}
template<class F>
MenuItemDispatcher<F> MakeMenuItemDispatcher(F f)
{
return MenuItemDispatcher<F>(f);
}
int main()
{
NoncopyableObject obj(7);
MakeMenuItemDispatcher(boost::bind(&MenuItem))(obj);
}
如果我在main()中将boost::bind更改为std::tr1::bind,我会得到一个错误:
错误C2248:
'boost::noncopyable_::noncopyable::noncopyable'
: cannot access private member in class'boost::noncopyable_::noncopyable'
.这个诊断发生在编译器生成的函数
'NoncopyableObject::NoncopyableObject(const NoncopyableObject &)'
它试图为NoncopyableObject生成一个复制构造函数。有人知道为什么会这样吗?MenuItemDispatcher的调用操作符接受对NoncopyableObject的引用,因此我正在努力查看出了什么问题。
这似乎是bind
在MS Visual Studio(包括2010)和GNU gcc(我测试了4.4.1和4.5.2,两者都以您期望的方式工作)中实现的差异
考虑以下代码,给定您的定义
auto b = boost::bind(&MenuItem);
NoncopyableObject obj(7);
b(obj); // OK in VS and GCC
用std::bind替换boost::bind(我使用的是2010,错误信息似乎与2008相同)
auto b = std::bind(&MenuItem);
NoncopyableObject obj(7);
b(obj); // compile error in VS 2010 SP1, OK in GCC
b(std::reference_wrapper<NoncopyableObject>(obj)); // OK in both
所以,发生的事情是,MS的bind()
即使参数不被使用,也会复制它的参数,而boost和GCC的bind()
根本不关心这个参数。
我能够通过将FUNC
类型定义更改为
typedef boost::function1<void, std::tr1::reference_wrapper<NoncopyableObject> > FUNC;
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 在 std::函数上递归应用 std::bind 的问题
- boost:asio:read_until问题与boost::bind有关
- 使用 boost::bind 和 boost::function 时出现问题
- 使用std::bind在lambda中捕获std::unique_ptr时出现问题
- 这种使用 boost::lambda::bind 有什么问题?
- 用std::tr1::bind替换boost::bind出现问题