コンパイラの警告 (レベル 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;
}