2016-01-27 9 views
7

amaçlanmaktadır ++ 2015std :: bind() hatası: aşırı fonksiyonun hangi örneği "boost :: asio :: io_service :: run" belirleyemez Visual C bu derlemeye çalışırken

auto worker = std::bind(&boost::asio::io_service::run, &(this->service)); 
Ben

Benaşırı yükler olduğunu görmek

cannot determine which instance of overloaded function "boost::asio::io_service::run" is intended 

: m alma hataları: ile

error C2783: 'std::_Binder<_Ret,_Fx,_Types...> std::bind(_Fx &&,_Types &&...)': could not deduce template argument for '_Ret' 
note: see declaration of 'std::bind' 

error C2783: 'std::_Binder<_Ret,_Fx,_Types...> std::bind(_Fx &&,_Types &&...)': could not deduce template argument for '_Fx' 
note: see declaration of 'std::bind' 

error C2783: 'std::_Binder<std::_Unforced,_Fx,_Types...> std::bind(_Fx &&,_Types &&...)': could not deduce template argument for '_Fx' 
note: see declaration of 'std::bind' 

Ayrıca, IntelliSense şikayet. Ama hangisini kullanacağımı nasıl belirleyebilirim? boost::bind kodu ile

gayet derler: İki aşırı yükleme yaparak sahiptir

auto worker = boost::bind(&boost::asio::io_service::run, &(this->service)); 
+2

Sadece bir lambda kullan ...> _> – ildjarn

cevap

6

boost::asio::io_service::run olduğundan, bir işlev işaretçisi olarak kullanırken kullanmak istediğinizi belirtmek gerekir (1). Bu hak fonksiyon imza için dökülmesiyle yapılması gereken: Bu korkunç görünüyor

static_cast<std::size_t(boost::asio::io_service::*)()>(&boost::asio::io_service::run) 

beri, lambda yerine bağlamak ifadesini kullanmanızı öneririz. Bir lambda İçinde normal aşırı yük çözünürlük gerçekleşir, bu nedenle açıkça aşırı belirtmek gerekmez:

auto worker = [this]{ return service.run(); }; 

(1) sorun std::bind kısıtlanmamış bir şablon argüman tarafından fonksiyonunu almasıdır Bu nedenle, şablon tipi kesinti kuralları aşırı yük çözünürlüğü yerine uygulanır. C++, türü belirtilmemiş bir şey ilettiğinizden, _Fx türünün burada ne olması gerektiğini belirleyemez. C++, bağımlı argümanların işleve geçeceği gerçeği kullanılırken aşırı yüklenmeyi çözmeye çalışacak bir hile olsa bile, aslında her iki aşırı yüklenmenin de burada mümkün olduğunu unutmayın: boost::system::error_code & ec ile aşırı yüklenme, basit bir şekilde bağlanmayacaktır. ve bunun yerine "curried" (bu parametrenin değerini belirtmek worker çağrıldığında noktaya ertelenir).

+0

@leemes, 'this' nesnesinin bir kopyasını geçmiyor musunuz? – zaratustra

+0

Biliyorum, ama '& (this-> service)' ın bir kopyasını 'bind' yoluyla geçirmekten daha da kötü değil. Io_service'nin çalıştığı süre boyunca bu şeyin canlı olduğundan emin oluyorum. – rustyx

+0

Eğer 'bu' lambda hayatta kalmak için garantili değilse, ancak servis (gerekiyorsa) servise değere göre bir işaretçi iletebilirsiniz. C++ 14 ile: '[s = & (this-> service)] {s-> run(); } 'veya C++ 11 ile lambda'dan önce geçici bir değişken kullanarak:' auto s = & (this-> service); otomatik çalışan = [s] {s-> run(); }; ' – leemes

İlgili konular