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() 编译错误的主要内容,如果未能解决你的问题,请参考以下文章