Avertissement du compilateur (niveau 1) C4342

changement de comportement : 'function' appelé, mais un opérateur membre a été appelé dans les versions précédentes

Dans les versions de Visual C++ avant Visual Studio 2002, un membre a été appelé, mais ce comportement a été modifié et le compilateur trouve désormais la meilleure correspondance dans l’étendue de l’espace de noms.

Si un opérateur membre a été trouvé, le compilateur ne considère pas auparavant aucun opérateur d’étendue d’espace de noms. S’il existe une meilleure correspondance au niveau de l’étendue de l’espace de noms, le compilateur actuel l’appelle correctement, tandis que les compilateurs précédents ne le considèrent pas.

Cet avertissement doit être désactivé une fois que vous avez correctement porté votre code vers la version actuelle. Le compilateur peut donner des faux positifs, générant cet avertissement pour le code où il n’y a aucune modification de comportement.

Cet avertissement est désactivé par défaut. Pour plus d'informations, consultez Compiler Warnings That Are Off by Default.

L’exemple suivant génère l’erreur C4342 :

// C4342.cpp
// compile with: /EHsc /W1
#include <fstream>
#pragma warning(default: 4342)
using namespace std;
struct X : public ofstream {
   X();
};

X::X() {
   open( "ofs_bug_ev.txt." );
   if ( is_open() ) {
      *this << "Text" << "<-should be text" << endl;   // C4342
      *this << ' ' << "<-should be space symbol" << endl;   // C4342
   }
}

int main() {
   X b;
   b << "Text" << "<-should be text" << endl;
   b << ' ' << "<-should be space symbol" << endl;
}