Неоднозначность типа итератора. VC6
От: valker  
Дата: 11.05.06 08:11
Оценка:
Здравствуйте!

Столкнулся с такой проблемой.
Упрощенный код:
template<typename T>
struct myiter : public std::list<T>::iterator {
};

template<typename T>
myiter<T> getBegin(list<T>& lst) {
  return myiter<T>();
}

struct op {
  void operator()(int i) {
    std::cout << i << std::endl;
  }
};

void CPlaceNodeAlgorithm::placeDomesticNodes()
{
  std::list<int> lst;
  std::for_each(getBegin(lst), lst.end(), op());
}


В выделенной строке компилятор (vc6) не может определить, какой тип итератора использовать для шаблонной функции std::for_each.

error C2782: '_Fn __cdecl std::for_each(_II,_II,_Fn)' : template parameter '_II' is ambiguous
could be 'class std::list<int,class std::allocator<int> >::iterator'
or 'struct myiter<int>'


По-моему, неопределённости нет, ведь myiter<T> должен автоматически конвертироваться в list<T>::iterator. Или я неправ?

Заранее спасибо.
Posted using RSDN@HOME
Re: Неоднозначность типа итератора. VC6
От: Lorenzo_LAMAS  
Дата: 11.05.06 08:41
Оценка:
V>В выделенной строке компилятор (vc6) не может определить, какой тип итератора использовать для шаблонной функции std::for_each.

А ты погляди на объявление std::for_each

template<class InputIterator, class Function>
    Function for_each(InputIterator first, InputIterator last, Function f);


Ты для first дал объект одного типа, для last — другого. Компилятор должен вывести тип InputIterator, и он получается либо myiter<T> либо std::list<>::iterator. Преобразования тут не причем, тип так не может быть выведен.
Of course, the code must be complete enough to compile and link.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.