Hi
Хотелось реализовать функцию find() следущюим образом:
class myclass
{
bool find(const Type &val, int first = 0, int last = _size);
....
int _size;
};
Но компилятор ругается:
error C2648: 'myclass<Type>::_size' : use of member as default parameter requires static member
Я не могу делать static _size !!!
Как решить эту проблему что-то не соображу.
Здравствуйте, Чили, Вы писали:
Ч>Как решить эту проблему что-то не соображу.
Так попробуй:
class myclass
{
bool find(const Type &val, int first = 0, int last );
bool find(const Type &val, int first = 0, ) { return find( val, first, _size );
....
int _size;
};
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Чили, Вы писали:
Ч>>Как решить эту проблему что-то не соображу. E>Так попробуй:
E>
class myclass
E>{
E> bool find(const Type &val, int first = 0, int last );
//Эта фишка не прокатит: missing default parameter for parameter 3
E> bool find(const Type &val, int first = 0, ) { return find( val, first, _size );
E> ....
E> int _size;
E>};
Re[3]: параметр по умолчанию - член класса
От:
Аноним
Дата:
06.09.07 13:36
Оценка:
Здравствуйте, Чили, Вы писали:
E>>
class myclass
E>>{
E>> bool find(const Type &val, int first /*= 0 не нужны тут дефолтные параметры!*/, int last );
Ч>//Эта фишка не прокатит: missing default parameter for parameter 3
// А подумать?!
E>> bool find(const Type &val, int first = 0/*а тут пусть будут*/ ) { return find( val, first, _size );
E>> ....
E>> int _size;
E>>};
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Чили, Вы писали:
E>>>
class myclass
E>>>{
E>>> bool find(const Type &val, int first /*= 0 не нужны тут дефолтные параметры!*/, int last );
Ч>>//Эта фишка не прокатит: missing default parameter for parameter 3
А>// А подумать?!
E>>> bool find(const Type &val, int first = 0/*а тут пусть будут*/ ) { return find( val, first, _size );
E>>> ....
E>>> int _size;
E>>>};
Велик и могуч язык C++ !!!
Чили пишет: > Хотелось реализовать функцию find() следущюим образом: > > class myclass > { > bool find(const Type &val, int first = 0, int last = _size); > .... > int _size; > };
Такие финты надо делать через перегрузку.
// find it with the internal size
inline bool myclass::find(const Type &val, int first = 0)
{
return find(val, first, this->_size);
}
// find it with explicitly specified size
bool myclass::find(const Type &val, int first, int last)
{
....
}
Анатолий Широков пишет:
> Используй фиктивный элемент > > bool find(const Type &val, int first = 0, int last = -1) > { > if( last == -1 ) > last = _size; > ... > }
Фу, фу, фу, Анатолий, мне стыдно это слышать от вас !
Нет, не верю что вы могли такое посоветовать ...
Шучу конечно, хотел и сам такое посоветовать, но
с перегрузкой лучше. Только там придется перегружать поболе,
если, как и в этом случае, предыдущие параметры тоже имеют
умолчания. Трюк с фиктивным значением конечно позволяет
этого избежать — 5-7 перегруженных функций уже не будет.
Но использовать какие-то предопределенные невалидные значения —
плохо.
Надо вообще сказать, что по подразумеваемой семантике
(хотя она от нас и скрыта) видимо типы first & last должны
быть size_t, или итераторы. А там unsigned int last = (unsigned int)-1
уже невозможно. Но надо признать, что даже в STL такие трюки
применяются, что же требовать от нас, простых смертных ...
Здравствуйте, MasterZiv, Вы писали:
MZ>Анатолий Широков пишет:
>> Используй фиктивный элемент >> >> bool find(const Type &val, int first = 0, int last = -1) >> { >> if( last == -1 ) >> last = _size; >> ... >> }
MZ>Фу, фу, фу, Анатолий, мне стыдно это слышать от вас ! MZ>Нет, не верю что вы могли такое посоветовать ... MZ>
Ильюха, с каких это пор мы на вы? Что касается, собственно, вопроса. Да, вроде, ничего смешного и, тем более, постыдного я не посоветовал. В данному случае, согласен, перегрузка уместнее, но фиктивные значения тоже имеет право на существование. Например, в std::string сигнатуры изобилуют std::basic_string<>::npos в качестве дефолтного значения и во многих других частях STL.