2016-07-28 4 views
1

Я получаю сообщение об ошибке при попытке скомпилировать код ниже:повышение :: обещание :: set_exception() ошибка компиляции

#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: «повышение :: copy_exception»: неоднозначный вызов перегруженная функция d: \ Projects \ импульс \ boost_1_55_0 \ подталкивание \ нить \ future.hpp 2092

Я использую VS2010 и увеличить 1,55

Для справки: осуществление `повышающего :: обещание: : 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?

+0

Интересно, действительно ли это: http://stackoverflow.com/questions/37831458/where-is-stdcopy-exception-defined –

ответ

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(). Выполнение шаблона функции приводит к неквалифицированным звоните в copy_exception() в пространстве имен boost. Это находит:

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.

+0

Спасибо за подробное объяснение причину неоднозначного вызова –