2014-12-02 18 views
9

İşte sorum şu: Bir functor tanımlamak: Anonim işlev nesnesini std :: function öğesine geçirin mi?

class A { 
public: 
    int operator()(int a, int b) const{ 
    return a + b; 
    } 
}; 
typedef function<int (int, int)> Fun; 

sonra bir std :: fonksiyon nesnesi oluşturmak için bir anonim functor kullanıyorum ve garip bir şey bulmak. İşte benim kodum:

Fun f(A()); 
f(3, 4); 

Maalesef yanlış. Hata iletisi: Ancak

error: invalid conversion from ‘int’ to ‘A (*)()’ [-fpermissive] 
error: too many arguments to function ‘Fun f(A (*)())’ 

, ben aşağıdaki gibi benim kodunu değiştirmek zaman:

A a; 
Fun f(a); 
f(3, 4); 

veya

Fun f = A(); 
f(3, 4); 

sonuç doğru. Peki, neden bu? Anladım, lütfen. Teşekkürler.

cevap

13
Fun f(A()); 

Bu, most-vexing parse örneğidir. Bir Fun döndüren f işlevini bildirir. Hiçbir argüman almayan ve bir A döndüren bir işleve işaret eden bir argüman olarak bir fonksiyon göstergesini alır.

Fun f{A()}; // Uniform-initialisation syntax 
Fun f{A{}}; // Uniform-initialisation on both objects 
Fun f((A())); // Forcing the initialiser to be an expression, not parameter list 

Yoksa yaptığımız şeylerden biri:

Bunu aşmanın birkaç yolu vardır.

+0

Bana onu dövdün. Çoğu parseli ayrıştırma problemi. –

+0

Bazen, bilgisayar bilimlerindeki terimler yanıltıcı şekilde adlandırılır. Bu o zamanlardan biri değil. – Yakk

İlgili konular