【问题标题】:boost::promise::set_exception() compilation errorboost::promise::set_exception() 编译错误
【发布时间】: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 编译代码的选项吗?

【问题讨论】:

标签: c++ boost boost-thread


【解决方案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 的重载。

【讨论】:

  • 感谢详细解释模糊调用的原因
猜你喜欢
  • 1970-01-01
  • 2016-11-20
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
相关资源
最近更新 更多