编译器警告(等级 1)C4342

行为更改: 调用了“function”,但在以前版本中调用的是成员运算符

在 Visual Studio 2002 之前的 Visual C++ 版本中,调用了一个成员,但此行为已更改,编译器现在可在命名空间范围内找到最佳匹配项。

如果找到了成员运算符,则编译器以前不会考虑任何命名空间范围运算符。 如果命名空间范围内有更好的匹配项,则当前编译器正确调用它,而以前的编译器不会考虑它。

成功将代码移植到当前版本后,应禁用此警告。 编译器可能会给出误报,为没有行为更改的代码生成此警告。

默认情况下,此警告处于关闭状态。 有关详细信息,请参阅 Compiler Warnings That Are Off by Default

下面的示例生成 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;
}