Вопрос по find из STL

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Llex
Сообщения: 10
Зарегистрирован: 19 июл 2008, 19:00

Изучаю С++. Читаю Бьерна Страуструпа.

Почти его пример не хочет работать

Код: Выделить всё

	
       string buf;
	int i=0;
	string::const_iterator sci;

	cout << "Input string: ";
	cin>>buf;

	sci = find(buf.begin(),buf.end(),'a');
	
	while(sci!= buf.end())
	{
		
		if(*(sci+1) == 'b')
			i++;
		sci = find(sci+1,buf.end(),'a');


	}
Так вот на строку sci = find(sci,buf.end(),'a'); ругается компилятор. VS2008.
Выдает следующую ошибку: _InIt std::find(_InIt,_InIt,const _Ty &)' : template parameter '_InIt' is ambiguous

Чем ему не нравиться итератор sci?
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

ambiguous - неоднозначный.
Обычно подобные ошибки выдаются, когда сущетсвует несколько функций с указанным именем (так называемая "перегрузка функций"), и компилятор при данных параметрах вызова не может определить, какую именно из "перегуженных" функций следует вызывать.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ты до конца не прочёл. Полный текст ошибки:

Код: Выделить всё

:\Cpp\Test\Test.cpp(53) : error C2782: '_II __cdecl std::find(_II,_II,const _Ty &)' : template parameter '_II' is ambiguous
        could be 'char *'
        or       'const char *'
Дело в том, что у строки есть два метода begin(). Один возвращает char*, другой const char*. То же самое с методом end(). На этапе инстанцирования шаблона не получается понять какой тип нужно использовать.

Есть два пути решения проблемы:

1. Указать явно какие типы должны использоваться в find (либо написав явное преобразование параметров функции, либо указав правильные параметры для инстанцирования).

2. Более правильный способ. Использовать find для строки (buf.find()).
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Llex
Сообщения: 10
Зарегистрирован: 19 июл 2008, 19:00

В том то и дело, что на sci = find(buf.begin(),buf.end(),'a'); не ругается. Компилируется нормально. Мне нужно найти следующее вхождение символа \а.
Полное описание ошибки...

Код: Выделить всё

d:\lex\myprograms\учеба\глава5пр12\глава5пр12\глава5пр12.cpp(30) : error C2782: '_InIt std::find(_InIt,_InIt,const _Ty &)' : template parameter '_InIt' is ambiguous
        c:\program files\microsoft visual studio 9.0\vc\include\algorithm(72) : see declaration of 'std::find'
        could be 'std::_String_iterator<_Elem,_Traits,_Alloc>'
        with
        [
            _Elem=char,
            _Traits=std::char_traits<char>,
            _Alloc=std::allocator<char>
        ]
        or       'std::_String_const_iterator<_Elem,_Traits,_Alloc>'
        with
        [
            _Elem=char,
            _Traits=std::char_traits<char>,
            _Alloc=std::allocator<char>
        ]
Build log was
--------------------------------------------------------------------------------
Добавленное сообщение
--------------------------------------------------------------------------------
Спасибо разобрался сам. Входными параметрами для find в VS2008 является string::iterator, а я подсовывал string::const_iterator.
Сменил тип на string::iterator. И все заработало. Только почему так не знаю... :confused:
Ответить