【发布时间】:2012-10-20 22:42:50
【问题描述】:
我正在尝试将我的项目从 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>' 的运算符(或没有可接受的转换)
...
可能是“内置 C++ 运算符!(布尔)”
C++11 标准指定unique_ptr has a bool operator 允许您像我上面那样进行快速检查。更奇怪的是,VS2012 的 unique_ptr 定义有这个操作符:
_OPERATOR_BOOL() const _NOEXCEPT
{ // test for non-null pointer
return (this->_Myptr != pointer() ? _CONVERTIBLE_TO_TRUE : 0);
}
但是我在编译时得到了那个错误。为什么?
是的,我可以改用ofstream,但这不是重点。
【问题讨论】:
-
这似乎是由于使用 lambda 作为自定义删除器造成的。如果您使用其他东西,例如一个普通的函数对象,那么就没有问题了。
标签: c++ visual-c++ c++11 visual-studio-2012 unique-ptr