2015-10-22 1 views
0

Pour une raison quelconque, je reçois ce message d'erreurboost :: tuple avec pointeur fonction membre

opérandes invalides de types de vide (S :: * const)() 'et « void (S :: * const)() » binaire « opérateur < »

pour cet extrait de code:

#include <boost/tuple/tuple.hpp> 
#include <boost/tuple/tuple_comparison.hpp> 

struct S 
{ 
    void f() {} 
}; 

typedef void(S::*tdef)(); 

int main() 
{ 
    boost::tuple<tdef> t1(&S::f); 
    boost::tuple<tdef> t2(&S::f); 
    return t1 < t2; 
} 

documents Boost sont très peu loquace sur l'utilisation des pointeurs de fonction membre dans tuples (à part qu'ils sont des éléments valables s), donc je n'ai pas vraiment la moindre idée de ce qui pourrait être le problème ou comment ces qualificatifs 'const' sont entrés dans l'expression.

Un conseil?

+1

Que voulez-vous réaliser avec cet 'opérateur <'? Les pointeurs de fonction membre dans C++ ne sont pas comparables sur le plan relationnel. – SingerOfTheFall

+3

'boost :: tuple's sont comparés lexicographiquement. Donc 't1 101010

+0

Je suppose qu'il est logique que le type de paramètre de & S :: f soit déduit comme void (S :: * const)(). L'adresse de la fonction (S :: f dans ce cas) est une constante. Vous pouvez essayer de surcharger l'opérateur global rakeshdn

Répondre

2

Les tuples essaieront de faire la comparaison sur un pointeur de fonction et vous ne pourrez comparer les pointeurs de fonction que pour l'égalité. Veuillez également vous reporter à this question

Les pointeurs de fonction ne sont pas comparables sur le plan relationnel en C++. Les comparaisons d'égalité sont prises en charge, sauf dans les cas où au moins l'un des pointeurs pointe vers une fonction membre virtuelle (auquel cas le résultat n'est pas spécifié).

+0

J'ai lu cela avant de demander, mais boost boost a une solution de contournement de niveau bas .. – Rathelor

+0

si vous regardez la mise en œuvre de tuple_comparison.hpp, vous verrez que les opérateurs (dans votre cas lt) itérent à travers tous les types à l'intérieur du tuple et appelez kittikun