2010-02-20 12 views
67

Aşağıdaki kod, cl.exe'nin çökmesine neden oluyor (MS VS2005).Bir üye işleviyle destek bağlama kullanımı

#include "stdafx.h" 
#include <boost/function.hpp> 
#include <boost/bind.hpp> 
#include <functional> 

class myclass { 
public: 
    void fun1()  { printf("fun1()\n");  } 
    void fun2(int i) { printf("fun2(%d)\n", i); } 

    void testit() { 
     boost::function<void()> f1(boost::bind(&myclass::fun1, this)); 
     boost::function<void (int)> f2(boost::bind(&myclass::fun2, this)); //fails 

     f1(); 
     f2(111); 
    } 
}; 

int main(int argc, char* argv[]) { 
    myclass mc; 
    mc.testit(); 
    return 0; 
} 

yanlış yapıyorum: Bir Sınıfım bir yöntemi çağırır için
Ben bir işlevi oluşturmak için boost bağlama kullanmaya çalışıyorum?

cevap

89

Kullanım yerine aşağıdaki:

boost::function<void (int)> f2(boost::bind(&myclass::fun2, this, _1)); 

Burası tutabildiğini kullanarak fonksiyona işlev nesnesine geçirilen ilk parametre iletir - Eğer Boost.Bind parametrelerin nasıl anlatmalıyım. İfadenizle, onu argüman almadan üye bir işlev olarak yorumlamaya çalışır.
Bkz. Ör. Yaygın kullanım kalıpları için here veya here. VC8s Cl.exe düzenli Boost.Bind suistimallere çöker o

Not - Şüphe gcc ile bir test çantası kullanın ve şablon -internals eğer ile örneklenen edildi Bind parametreleri gibi muhtemelen iyi ipuçları alacak olursa çıktıyı okuyorsunuz.

+0

bu http://stackoverflow.com/questions/13074756/how-to-avoid-static-member-function-when-using-gsl-with-c ile ilgili herhangi bir şansınız olabilir mi? Bu benzer ama 'std :: function' bir hata veriyor –

+0

Teşekkür ederim, bu karışık kafa karıştırıcı ama cevabınız pastırmamı kurtardı! – portforwardpodcast

İlgili konular