2016-11-26 1 views
2

J'essaie le code suivant:erreur: ISO C++ interdit de prendre l'adresse d'une fonction de membre non-statique non qualifié ou parenthésée pour former un pointeur vers une fonction membre

std::thread t(&(Transmitter::sender), this, some_variables); 

où l'expéditeur est une fonction membre de la même classe de la méthode de laquelle la ligne ci-dessus est appelée.

Je reçois l'avertissement:

Transmitter.h: In member function 'int Transmitter::transmit_streams(std::vector<std::vector<single_stream_record> >, int, Receiver&)': 
Transmitter.h:81:44: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say '&Transmitter::sender' [-fpermissive] 

bien qu'il compile et fonctionne très bien. Comment puis-je supprimer cet avertissement.

Mon g ++ est 4.6.3 et je compile le code avec -std = C++ 0x.

Répondre

5

Le message d'erreur est très clair.

ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say '&Transmitter::sender' [-fpermissive]

De expr.unary.op

A pointer to member is only formed when an explicit & is used and its operand is a qualified-id not enclosed in parentheses. [ Note: That is, the expression &(qualified-id), where the qualified-id is enclosed in parentheses, does not form an expression of type “pointer to member”. Neither does qualified-id, because there is no implicit conversion from a qualified-id for a non-static member function to the type “pointer to member function” as there is from an lvalue of function type to the type “pointer to function” ([conv.func]). Nor is &unqualified-id a pointer to member, even within the scope of the unqualified-id's class. — end note ]

Vous devez utiliser:

std::thread t(&Transmitter::sender, this, some_variables); 

Voir this demo

+0

Oui, votre code semble fonctionner. Bien qu'étant nouveau en C++, je ne peux pas comprendre pourquoi. Je veux dire, la différence entre le vôtre et le mien est seulement que le tien manque de parenthèse autour de Transmitter :: sender. – AbbasFaisal

+0

@AbbasFaisal Parce que l'ISO C++ l'a dit, voir mon edit – Danh