我正在尝试将我的项目从 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
,但那不是重点。