2014-04-21 14 views
2

이 코드 말한다 :이 오류가일치하는 함수를 호출하지합니다 - 컴파일러는 I 전화 (QObject를 *) 호출입니다 (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)); 
} 

:

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

은 무엇 내가 빠졌어? 나는 포인터로 invokeMethod()을 호출하지만 컴파일러는 포인터 참조라고 불평합니다.

+0

"나는 포인터로 invokeMethod()를 호출합니다"당신이 참조하는 "포인터"는 존재하지 않습니다. 포인터에 대한 참조를 전달하고 있습니다. 아마도 const 참조 나 rvalue 참조 일 수도 있지만 여전히 그렇습니다. 컴파일러가 정확합니다. 값에 의한 인수 전달은 객체의 함수 로컬 복사본을 초기화하는 데 사용되는 const 참조 (또는 rvalue 참조)를 전달하여 작동합니다. –

답변

2

const char* 인 반면 QString은 두 번째 인수로 전달하려고합니다. 암시 적 변환이 없기 때문에 해당 유형으로 변환하십시오. 먼저 QByteArray로 변환하는 방법을 결정해야합니다, 그래서 이것은 잠재적으로 쓸 수있는 하나의 예이다 : 나는 같은 질문을 만난

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

나는 당신의 처음 대답을 언급하고있었습니다. 어쨌든, 문자열을 전달하면 GCC가 포인터 참조를 호출한다고보고하는 이유는 아직도 모르겠다 ... 나는 QString auto-cast를'char *'로 잘못 가정했지만 왜'QObject * &'? –

+0

Dunno 세부 사항 ... gcc는 너트입니다 :) – lpapp

+0

@ user2341104'object'는 lvalue이므로. 컴파일러는 당신이'QObject * &'를 건네주지 않는다고 말했고, 당신은'QObject * &'를 받아 들일 수있는 함수를 호출하려고했다. – Oktalist

0

. 내 문제는 다른 요인에 의해 실제로 발생합니다. 나는 QT 4에서 QT 5 내 프로그램의 하나의 이동, 그리고 명시 적 인 QDialog를 선언하지 않았다, 그래서 나는이 메서드를 호출 할 때 오류가 :

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

나는 컴파일 출력, 오류 메시지가 표시

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

갑자기, 나는 내가 인 QDialog를 선언하지 않는 것을 깨달았다이다. QT는 때로는 정말 좋은 컴파일 오류 출력을 줄 수 없다고 생각합니다.