2017年05月18日
locale でのDEBUG_NEW によるコンパイルエラー
std::locale を使ってifstream でUTF-8 文字コードのファイルを読み込む設定をした際にコンパイルエラーに遭遇したので、覚書として書きます。
コンパイラ
VC10 (Visual Studio 2010 Professional sp1)
起こったこと
次のコードをコンパイルしたときに、環境を変えるとコンパイルが通ったり通らなかったりしました。
コード
#include <codecvt>
#include <fstream>
...
std::wifstream ifs;
ifs.imbue(std::locale(std::locale::empty(), new sd::codecvt_utf8<wchar_t>));
エラー
UTF-8 locale in Visual C++ 2010 にあるのと同じエラーが出たので引用します。
error C2661: 'std::locale::facet::operator new' : no overloaded function takes 3 arguments
error C2664: 'std::locale::locale(const char *,std::locale::category)' : cannot convert parameter 1 from 'std::locale' to 'const char *'
回避方法
リンク先にあるようにdebug 時にDEBUG_NEW を使わせないように下記のようにコードを変更すれば回避はできました。
ifs.imbue(std::locale(std::locale::empty(), ::new sd::codecvt_utf8<wchar_t>));
new をグローバルスコープを付けてDEBUG_NEW を使わせないように変更。
ただし、回避はできても根本的な解決には至っていないのでどうにか原因を突き止めたいです。
ちなみに自分の使っている計算機はハードディスク周りが不調なのでそっちが原因なのかなとも思いましたが、VS2010 をクリーンインストールした直後にコンパイルエラーになってしまったのでますます不思議です。