2014-04-21 3 views
2

Voici le code:Aucune fonction de correspondance pour appeler - compilateur dit que je appel (QObject * &) lorsque l'appel est (QObject *)

void invokeQMLFunction2Arg(QObject * object, QString func, QVariant p1, QVariant p2) { 
    QMetaObject::invokeMethod(object, func, Qt::DirectConnection, Q_ARG(QVariant, p1), Q_ARG(QVariant, p2)); 
} 

Ceci est l'erreur:

error: no matching function for call to 'QMetaObject::invokeMethod(QObject*&, QString&, Qt::ConnectionType, QArgument<QVariant>, QArgument<QVariant>)' 

Qu'est-ce que Ai-je disparu? J'appelle invokeMethod() avec un pointeur, mais le compilateur se plaint qu'il s'agit d'une référence de pointeur.

+0

"J'appelle invokeMethod() avec un pointeur" Le "pointeur" auquel vous faites référence n'existe pas. Vous passez une référence à un pointeur, peut-être même une référence const ou une référence rvalue, mais quand même. Le compilateur est correct. La transmission d'arguments par valeur fonctionne en transmettant une référence const (ou une référence rvalue) qui est ensuite utilisée pour initialiser une copie fonction-locale de l'objet. –

Répondre

2

Vous essayez de transmettre un QString au deuxième argument, alors que cela devrait être const char*. Convertissez cela en le bon type car il n'y a pas de conversion implicite. Vous devez décider quel moyen de le convertir en QByteArray premier, donc c'est un exemple que vous pourriez potentiellement écrire:

QMetaObject::invokeMethod(object, func.toUtf8().constData(), Qt::DirectConnection, Q_ARG(QVariant, p1), Q_ARG(QVariant, p2)); 
+0

Je parlais de votre réponse initiale. Quoi qu'il en soit, je ne comprends toujours pas pourquoi le passage d'une chaîne rendrait le rapport GCC que j'appelle avec une référence de pointeur ... J'ai supposé incorrectement que QString auto-castait en 'char *', mais pourquoi le 'QObject * &'? –

+0

Ne connait pas les détails ... gcc est écrou :) – lpapp

+0

@ user2341104 Parce que 'object' est une lvalue. Le compilateur n'a pas dit que vous avez passé un 'QObject * &', il a dit que vous avez essayé d'appeler une fonction qui pourrait _accept_ a 'QObject * &'. – Oktalist

0

J'ai rencontré la même question. et Mon problème est réellement cause par d'autres facteurs. Je propose l'un de mon programme de QT 4 à QT 5, et je ne déclare QDialog explicitement, quand j'appelle la méthode, il y a l'erreur:

error: no matching function for call to 'QMetaObject::invokeMethod(QDialog*&, const char [12],  Qt::ConnectionType)' 

et je vois la sortie de la compilation, le message d'erreur est,

note: no known conversion for argument 1 from 'QDialog*' to 'QObject*' 

soudain, j'ai réalisé que je ne déclare pas le Qdialog. QT parfois ne peut pas donner une très bonne sortie d'erreur de compilation, je pense.

Questions connexes