プロジェクトを Visual Studio 2010 から Visual Studio 2012 に移植しようとしています。コードには、次のようなファイル処理があります。
auto fileDeleter = [](FILE* f) { fclose(f); };
unique_ptr<FILE, decltype(fileDeleter)> fMinute(
fopen(minuteLogName.c_str(), "w"), fileDeleter);
unique_ptr<FILE, decltype(fileDeleter)> fIndividual(
fopen(individualLogName.c_str(), "w"), fileDeleter);
if (!fMinute || !fIndividual) {
throw Exceptions::IOException("One of the log files failed to open",
__FUNCTION__);
}
これは 2010 年には問題なくビルドされましたが、2012 年には次の条件で失敗します。
エラー C2678: バイナリ '!' : タイプ > 'std::unique_ptr<_Ty,_Dx>' の左側のオペランドを取る演算子が見つかりません (または、受け入れ可能な変換がありません)
...
'built-in C++ operator!(bool)' である可能性があります
C++11 標準では、unique_ptr に bool 演算子があり、上記のようなクイック チェックを実行できるように指定されています。まだ見知らぬ人ですが、VS2012 の unique_ptr 定義には、まさにこの演算子があります。
_OPERATOR_BOOL() const _NOEXCEPT
{ // test for non-null pointer
return (this->_Myptr != pointer() ? _CONVERTIBLE_TO_TRUE : 0);
}
しかし、コンパイル時にそのエラーが発生します。なんで?
ofstream
はい、代わりに使用することもできますが、それは重要ではありません。