#include <vector>
class Sort{
private:
Sort(){}
public:
static void QuickSort(std::vector& v);
static void QuickSort(std::vector& v, int lo0, int hi0);
};
void Sort::QuickSort(std::vector &v, int lo0, int hi0)
{
}
//----------------------------------------------------------------------void Sort::QuickSort(std::vector& v)
{
QuickSort(v, 0, v.size() - 1);
}
почему компилер выдает ошибку
:\Projects_Visual\Spyder\libS\html_parser\util\sort\sort.cpp(11) : error C2662: 'size' : cannot convert 'this' pointer from 'class std::vector' to 'const class std::vector<_Ty,_A> &'
Reason: cannot convert from 'class std::vector' to 'const class std::vector<_Ty,_A>'
Conversion requires a second user-defined-conversion operator or constructor
H>:\Projects_Visual\Spyder\libS\html_parser\util\sort\sort.cpp(11) : error C2662: 'size' : cannot convert 'this' pointer from 'class std::vector' to 'const class std::vector<_Ty,_A> &'
H> Reason: cannot convert from 'class std::vector' to 'const class std::vector<_Ty,_A>'
H> Conversion requires a second user-defined-conversion operator or constructor
H>
H>в чем я неправ?
... << RSDN@Home 1.1 beta 2 >>
The life is relative and reversible.
Re: static and reference
От:
Аноним
Дата:
30.09.03 09:32
Оценка:
Здравствуйте, Holms, Вы писали:
H>Можно ли так писать
[]
H>почему компилер выдает ошибку H>
H>:\Projects_Visual\Spyder\libS\html_parser\util\sort\sort.cpp(11) : error C2662: 'size' : cannot convert 'this' pointer from 'class std::vector' to 'const class std::vector<_Ty,_A> &'
H> Reason: cannot convert from 'class std::vector' to 'const class std::vector<_Ty,_A>'
H> Conversion requires a second user-defined-conversion operator or constructor
H>
H>в чем я неправ?
А у тебя сверху по коду, часом, не написано "class std::vector;"?
В том, что std::vector не является typename-ом. Либо тебе нужно уточнить тип данных для которого ты пишешь сортировку (например, std::vector<int>), либо параметризовать методы типом, с которым ты будешь работать:
class QuickSort
{
public:
template<typename T>
static void Sort::QuickSort(std::vector<T> &v, int lo0, int hi0)
{
...
}
};
Здравствуйте, Holms, Вы писали:
H>Вы абсолютно правы
Кстати Анатолий Ширков предложил более удобный вариант. Только не надо забывать о том, что определение шаблонных функций — членов нужно писать сразу в теле класса, если мы имеем дело с MSVC6:
class Sort{
private:
Sort(){}
public:
template <class T>
static void QuickSort(std::vector<T>& v){ std::sort(v.begin(), v.end());}
template <class T>
static void QuickSort(std::vector<T>& v, int lo0, int hi0){QuickSort(v, 0, v.size() - 1);}
};
int main()
{
vector<int> arr;
...
Sort::QuickSort(arr);
return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re[2]: static and reference. дополнительный вопрос
Здравствуйте, Анатолий Широков, Вы писали:
H>>в чем я неправ?
АШ>В том, что std::vector не является typename-ом. Либо тебе нужно уточнить тип данных для которого ты пишешь сортировку (например, std::vector<int>), либо параметризовать методы типом, с которым ты будешь работать:
Возник интересный вопрос по поводу темплейтов.. если у нас, допустим, описано так:
template<class T> class base
{
public:
base() {};
~base() {};
virtual void Set(T)=0;
virtual T Get()=0;
};
class ibase: public base<int>
{
public:
inline void Set(int value) {...}
inline int Get() {...}
};
class fbase: public base<float>
{
public:
inline void Set(float value) {...}
inline float Get() {...}
};
class cbase: public base<char>
{
public:
inline void Set(char value) {...}
inline char Get() {...}
};
Как в таком случае:
1. в готовом экземпляре класса программно определить его тип;
2. передать какой-либо функции как параметр элемент произвольного типа.
пока придумал только в конструкторе инициализировать переменную, в которую записываю тип и крутиться с помощью void*.. т.е. делать так:
enum ntype {
type_integer,
type_float,
.....
}
template<class T> class base
{
public:
base(ntype _type):type(_type) {};
~base() {};
virtual void Set(T)=0;
virtual T Get()=0;
public:
ntype type;
};
class ibase: public base<int>
{
public:
ibase():base<int>(type_integer) {};
inline void Set(int value) {...}
inline int Get() {...}
};
.....
void func(void * tmp)
{
if (!tmp) return;
switch(((base<void>*)tmp)->type)
{
case type_integer:
...
break;
case type_float:
...
break;
case type_char:
...
break;
......
}
}
может можно как-то правильнее указать ссылку на наследник такого класса? ведь все-равно он занимать памяти будет как указатель, но компилятор тип (base*) никак не воспринимает....
Re[3]: static and reference. дополнительный вопрос