web-dev-qa-db-fra.com

Comment obtenir que VS2015 refuse à juste titre l'utilisation d'un préfixe de classe dans la déclaration de classe

J'ai récemment copié et collé une fonction membre C++ à partir de mon fichier cpp dans l'en-tête et oublié de supprimer le préfixe. Donc, dans le fichier cpp, j'avais quelque chose comme:

int MyClass::Return42() const { return 42; }

et dans ma tête:

class MyClass {
public:
    int MyClass::Return42() const;
};

Maintenant, je suis sure je l'ai déjà fait et le compilateur s'est plaint amèrement que ce n'était pas permis, ce qui a nécessité la suppression du préfixe de classe dans l'en-tête. En fait, g++ 5.4.0 s'en plaint sous Linux, quelle que soit la norme ISO que je cible (11 à 17), en utilisant un fichier single (bien que -fpermissive transforme cela en un avertissement plutôt qu'en une erreur):

#include <iostream>

class MyClass {
public:
    int MyClass::Return42() const;
};

int MyClass::Return42() const { return 42; }

int main() {
    MyClass x;
    std::cout << x.Return42() << '\n';
}

Mais je trouve que ma toute nouvelle installation de VsPro15 semble le permettre.

Comment faire en sorte que Visual Studio rejette ce code non valide, étant donné que j'aimerais que mon code soit portable sur différentes plates-formes?


Je connais les solutions suggérées impliquant /permissive- et /Ze.

Pour le premier, même avec VS2k15 Update 3, entrer /permissive- dans le champ Project properties | C/C++ | Command Line | Aditional Options entraîne les résultats suivants:

2> cl: avertissement de ligne de commande D9002: ignorer l'option inconnue '/ permissive-'

Pour le second, je vois:

2> cl: avertissement de ligne de commande D9035: l'option 'Ze' est obsolète et sera supprimée dans une version ultérieure

mais il compile le code errant quand même.

Donc, je ne pense pas que ce soit une solution viable.

10
paxdiablo

recherchez l'article C4596 dans l'article suivant:

https://blogs.msdn.Microsoft.com/vcblog/2016/11/16/permissive-switch/

//Use of qualified names in member declarations


struct A {
    void A::f() { } // error C4596: illegal qualified name in member declaration
                    // remove redundant 'A::' to fix
};
2
abdulrhmanOmran