2012-11-16 1 views
2

J'ai besoin d'un peu d'aide ici: lors de l'utilisation de g ++ 4.1 pour construire mon code, il n'y avait pas d'erreur concernant "référence à la classe est ambiguë". Il ne se produit que lors de l'utilisation g ++ 4.5.2 pour compiler le même code, et voici le fragment de code:Référence à la classe est ambigu lors de la compilation avec g ++ 4.5.2

#include "tlm_utils/simple_initiator_socket.h" 

using tlm_utils::simple_initiator_socket; 

class HvEcu : public sc_module { 
public: 
      ...... 
    simple_initiator_socket<HvEcu> initiator_socket; 
//object instantiated here, also problem happend here.... 
      ...... 
}; 

Je suis vraiment pas sûr pourquoi cela se passerait-il que la syntaxe de l'espace de noms est valable pour vous. Il y a une correction pour se débarrasser de ce message, et c'est à la place de "using tlm_utils :: simple_initiator_socket;" il suffit de mettre "tlm_utils :: simple_initiator_socket initiator_socket;" dans le corps de classe montré ci-dessus. Cependant, je ne vois pas pourquoi le code ci-dessus ne fonctionne pas étant donné que le seul changement est la version du compilateur.

+0

Votre code ne suffit pas pour savoir exactement quel est le problème, mais je suppose que vous avez une classe nommée simple_initiator_socket dans la portée principale, et que GCC est confus. –

+0

@ MaëlNison: Cela n'échouerait-il pas pour les deux versions du compilateur? –

+0

Peut-être que les 'anciennes' versions de GCC supposaient que l'instruction using signifiait que le développeur voulait explicitement utiliser le namespaced simple_initiator_socket? Je ne suis pas vraiment sûr, mais ça pourrait être une explication. –

Répondre

0

Essayez d'utiliser un appel explicite:

class HvEcu : public sc_module { 
    tlm_utils::simple_initiator_socket<HvEcu> initiator_socket; 

Leçon du jour: Restez à jour avec les changements du compilateur et utiliser le plus récent stable. Sinon, vous finirez par écrire du vieux code incorrect; et rencontrer d'autres effets secondaires du compilateur.

+0

comme je l'ai mentionné avant, cela fonctionne et construit en laissant la ligne d'utilisation là-bas, mais lors de la compilation en 4.5 .2, le correctif consiste à supprimer la ligne en utilisant tlm_utils :: simple_initatior_socket dans le corps à la place. La question est pourquoi, pourquoi la version originale n'est plus reconnue? – user960095

+0

@ user960095: Il semble y avoir un autre 'simple_iniatior_socket' présent, bit sans autre code, nous ne pouvons pas dire pourquoi. –

+0

ouais, cela fait partie de la bibliothèque standard de TLM. – user960095

Questions connexes