boost::promise::set_exception() 编译错误
Posted
技术标签:
【中文标题】boost::promise::set_exception() 编译错误【英文标题】:boost::promise::set_exception() compilation error 【发布时间】:2016-07-28 16:35:24 【问题描述】:尝试编译以下代码时出现错误:
#include <exception>
#include <boost/thread.hpp>
int _tmain(int argc, _TCHAR* argv[])
boost::promise<int> pr;
pr.set_exception(std::copy_exception(std::runtime_error("test")));
std::cout << "done" << std::endl;
错误 C2668:'boost::copy_exception':对重载函数 d:\projects\boost\boost_1_55_0\boost\thread\future.hpp 2092 的模糊调用
我正在使用 VS2010 和 Boost 1.55
供参考:`boost::promise::set_exception'的实现如下:
void set_exception(boost::exception_ptr p)
// exception is stored here
template <typename E> void set_exception(E ex)
set_exception(copy_exception(ex)); // <- this is the line 2092
所以,有一个模板版本,称为非模板版本。 我假设在我的情况下模板版本失败。
使用以下代码后问题消失:
pr.set_exception(boost::copy_exception(std::runtime_error("test")));
即使用boost::copy_exception()
代替std::copy_exception()
。
任何人都可以建议使用std::copy_exception
编译代码的选项吗?
【问题讨论】:
我想知道这是否相关:***.com/questions/37831458/… 【参考方案1】:tldr;你应该使用boost::copy_exception
。
boost::copy_exception
返回一个boost::exception_ptr
,所以当我们调用set_exception()
时,set_exception(exception_ptr )
重载是首选的非模板。这个调用是正确的。
std::copy_exception
(现在称为std::make_exception_ptr
)返回std::exception_ptr
。这与boost::exception_ptr
不是同一类型,因此首选函数模板set_exception()
。实例化函数模板会导致对命名空间boost
内的copy_exception()
的不合格 调用。发现:
namespace boost
template <class T> exception_ptr copy_exception(T const&);
由于这只是一个函数,因此我们对参数的关联命名空间进行依赖于参数的查找。 std::exception_ptr
的关联命名空间是 std
,因此我们最终还发现:
namespace std
template <class E> exception_ptr copy_exception(E );
这些函数模板都不比另一个更好,因此调用是模棱两可的。
由于使用std::copy_exception
没有任何优势,而且标准中甚至不存在该功能,因此请使用boost::copy_exception
。它做你想做的事。
或者,您可以只使用std::promise
,其set_exception()
仅具有一个采用std::exception_ptr
的重载。
【讨论】:
感谢详细解释模糊调用的原因以上是关于boost::promise::set_exception() 编译错误的主要内容,如果未能解决你的问题,请参考以下文章