2010-11-30 50 views
2

Je place une classe de pointeur intelligent en utilisant les médicaments génériques et je voulais forcer les utilisateurs de cette classe pour construire correctement le pointeur intelligent en utilisant la syntaxeLe mot-clé explicite dans MS Visual Studio 4.1

MyReference<TestCls>(mytest3)) 

ou

MyReference<TestCls> mytest4(new TestCls()); 

j'ai donc utilisé le mot-clé explicite sur la CTOR, pour empêcher cela:

MyReference aRef = NULL; 

Cependant, en raison de circonstances malheureuses indépendantes de ma volonté, je travaille sur du code qui est compilé en utilisant l'ancien compilateur MSVC++ 4.1. Je reçois les erreurs suivantes quand j'inclure le mot clé explicite:

MyReference.h (49): erreur C2501: 'explicite': manque décl-spécificateurs
MyReference.h (51): erreur C2143: erreur de syntaxe : disparu ';' avant ''
MyReference.h (52): erreur C2238: jeton inattendu (s) précédent ':'
MyReference.h (52): erreur C2059: erreur de syntaxe: 'constante'

int

Lorsque J'ajoute un #define explicit ces erreurs disparaissent. C'était un hack de ma part, juste pour que le compilateur ignore le mot-clé. Je suppose que cela signifie que explicite n'est pas supporté par yon olde compilateur. Quelqu'un peut-il confirmer cela et y a-t-il quelqu'un là-bas avec la connaissance d'une solution de contournement pour cela?

Merci Beaucoups, Dennis.

+1

Vous semblez avoir trouvé un solution de contournement! Je ne peux pas confirmer le problème, malheureusement, comme VC++ 4.1 est un peu trop rétro pour moi (je reviens aussi loin que VC++ 6), mais ma suggestion est simplement de tester _MSC_VER et d'appliquer cette définition si nécessaire. –

+2

Le mot-clé 'explicit', lorsqu'il fonctionne, n'empêche pas quelque chose comme' MyReference aRef = NULL; '. Ce qu'il fait est d'empêcher une conversion implicite dans quelque chose comme 'void func (MyReference ref); func (0); ' – aschepler

+0

Merci acshelper ... Vous êtes sur place bien sûr. Salutations pour votre aide aussi sgolodetz – Dennis

Répondre

2

This site a une solution de contournement pour cela, à savoir:

Malheureusement, compilateurs plus anciens ne peuvent pas soutenir l'utilisation de "explicite", qui pourrait être un mal de tête. Si vous êtes coincé travailler avec un hors-jour compilateur et ne peut pas obtenir un qui a une meilleure soutien à la norme C de, la meilleure solution peut être de tirer profit du fait qu'un seul La conversion implicite aura lieu pour une valeur donnée. Vous pouvez exploiter cela en utilisant une classe intermédiaire qui crée un objet de chaque type, et alors votre classe principale créer implicitement des objets de cette classe implicitement:

class proxy 
{ 
    public: 
    proxy(int x) : x(x) {} ; 
    getValue() { return x; } 

    private: 
    int x; 

}; 

class String 
{ 
    // this will be equivalent of explicit 
    String(proxy x) { /* create a string using x.getValue(); */ } 
} 
+0

Merci Joe ... qui semble faire l'affaire. – Dennis