Здравствуйте!
Столкнулся с такой проблемой.
Упрощенный код:
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
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. Преобразования тут не причем, тип так не может быть выведен.