2010-04-21 13 views
2

J'ai ce problème très étrange lors de la compilation du projet. MOC semble ajouter un espace de nom au nom de la classe en train d'être mocé, bien qu'il ne soit mentionné nulle part dans le fichier/classe.MOC ajouter un espace de noms aux noms de classes

L'espace de noms, cependant, existe dans une bibliothèque que je l'utilise, mais il est caché loin dans les fichiers d'en-tête et je ne l'utilisez pas dans les fichiers de l'interface utilisateur. C'est ce que MOC génère:

const QMetaObject SmpTl::CaptureController::staticMetaObject = { 
{ &QObject::staticMetaObject, qt_meta_stringdata_SmpTl__CaptureController, 
    qt_meta_data_SmpTl__CaptureController, 0 }}; 

L'espace de noms SmpTl est mentionné nulle part dans la déclaration de CaptureController, mais il apparaît dans le fichier .cpp généré MOC. J'utilise Visual Studio avec l'intégration QT.

Répondre

0

SmpTl est l'espace de noms CaptureController est défini dans, comme il a été constaté par MOC.

La macro Q_OBJECT dans la déclaration élargit la staticMetaObject variable dans votre définition de classe (entre autres choses, il prend son envol en). Le fichier MOC contient la définition de cette variable.

Si cela est correct, s'il vous plaît votre version Qt publier et une version dépouillée de votre fichier d'en-tête.

+1

J'ai trouvé le problème, il était un manque « " » dans le code asm de certains fichiers d'en-tête loin dans la liste d'inclusion. Le code a été # ifdef'ed seulement pour l'architecture MIPS, de sorte que le compilateur ne se plaignaient pas les disparus ", mais d'une manière ou d'une autre le MOC est devenu confus. – Florin

1

J'ai également rencontré ce problème. J'avais code qui ressemblait à ceci:

namespace foo { 
    #ifdef _WIN32 
    ... // This code was fine 
    #else 
    #error Not Supported 
    #endif 
} 

Cette confusion dans l'espace de noms MOC penser foo jamais fermé. Apparemment, il ne savait pas _WIN32 a été défini, et a été dérangé par le fait que j'ai oublié de mettre des citations autour du message d'erreur. Changement à

#error "Not Supported" 

résolu mon problème.

+1

Ran à travers le même problème, merci! Je dois ajouter que c'est arrivé seulement si la ligne #error contenait le caractère simple quot '''. Supprimer le '' 'ou entourer la chaîne d'erreur dans les guillemets' '' 'a réglé le problème pour moi. – Hossein