Visual Studio2008SP1で正常にコンパイルおよび実行される次のコードがあります。
#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'
クラスで宣言されたプライベートメンバーにアクセスできません'boost::noncopyable_::noncopyable'
。この診断は、コンパイラによって生成された関数で発生しました
'NoncopyableObject::NoncopyableObject(const NoncopyableObject &)'
したがって、NoncopyableObjectのコピーコンストラクターを生成しようとしています。なぜこれがそうなるのか誰もが知っていますか?MenuItemDispatcherの呼び出し演算子はNoncopyableObjectへの参照を取得するため、何が問題になっているのかを確認するのに苦労しています。