Re[3]: Почему неправильно выводится аргумент шаблона?
От: Павел Кузнецов  
Дата: 30.12.02 13:44
Оценка: 12 (1)
Здравствуйте, MaximE, Вы писали:

ME>Почему же тогда не компилируется эта строчка?

ME>
ME>std::bind1st(std::mem_fun_ref(SETTRADES::insert), trades)

ME>Как здесь появляется ссылка на ссылку?

template <class _Operation> 
class binder1st <...>
{ <...>
  typename _Operation::result_type
  operator()(const typename _Operation::second_argument_type& __x) const // [[*]<...>
};

template <class _Operation, class _Tp>
binder1st<_Operation> bind1st(const _Operation& __fn, const _Tp& __x) <...>


Т.к. insert имеет прототип

pair <iterator, bool> insert(const value_type& _Val);


результатом std::mem_fun_ref(&SETTRADES::insert) является:

std::mem_fun1_ref_t<
  std::pair<std::set<BasicTradeData*> >::iterator, bool>,
  std::set<BasicTradeData *>,
  const std::set<BasicTradeData *>::value_type &>


т.е., внутри шаблона binder1st typename _Operation::second_argument_type = const std::set<BasicTradeData *>::value_type &. В результате добавления к этому (уже ссылочному) типу еще одной ссылки (в точке [*]) и получается ссылка на ссылку, что стандартом не допускается.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.