Здравствуйте, Анатолий Широков, Вы писали:
H>>в чем я неправ?
АШ>В том, что std::vector не является typename-ом. Либо тебе нужно уточнить тип данных для которого ты пишешь сортировку (например, std::vector<int>), либо параметризовать методы типом, с которым ты будешь работать:
АШ>АШ>class QuickSort
АШ>{
АШ>public:
АШ> template<typename T>
АШ> static void Sort::QuickSort(std::vector<T> &v, int lo0, int hi0)
АШ> {
АШ> ...
АШ> }
АШ>};
АШ>
Возник интересный вопрос по поводу темплейтов.. если у нас, допустим, описано так:
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*) никак не воспринимает....