static and reference
От: Holms США  
Дата: 30.09.03 09:27
Оценка:
Можно ли так писать

#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


в чем я неправ?
... << RSDN@Home 1.1 beta 2 >>
The life is relative and reversible.
Re: static and reference
От: Holms США  
Дата: 30.09.03 09:29
Оценка:
Здравствуйте, Holms, Вы писали:

H>Можно ли так писать


H>
H>#include <vector>

H>class Sort{
H>private:
H>  Sort(){}
H>public:
H>  static void QuickSort(std::vector& v);
H>  static void QuickSort(std::vector& v, int lo0, int hi0);
H>};

H>void Sort::QuickSort(std::vector &v, int lo0, int hi0)
H>{
H>}
H>//----------------------------------------------------------------------
H>void Sort::QuickSort(std::vector& v)
H>{
H>  Sort::QuickSort(v, 0, v.size() - 1);
H>}
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>в чем я неправ?
... << 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;"?
Re: static and reference
От: Bell Россия  
Дата: 30.09.03 09:33
Оценка:
Здравствуйте, Holms, Вы писали:


H>в чем я неправ?


А какой тип имеет v?

Быть может нужно так?

template <class T>
class Sort{
private:
  Sort(){}
public:
  static void QuickSort(std::vector<T>& v);
  static void QuickSort(std::vector<T>& v, int lo0, int hi0);
};
template <class T>
void Sort<T>::QuickSort(std::vector<T> &v, int lo0, int hi0)
{
}
//----------------------------------------------------------------------
template <class T>
void Sort<T>::QuickSort(std::vector<T>& v)
{
  QuickSort(v, 0, v.size() - 1);
}

int main()
{
   vector<int> arr;
   Sort<int>::QuickSort(arr);
    
   return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re: static and reference
От: Анатолий Широков СССР  
Дата: 30.09.03 09:35
Оценка: 1 (1)
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)
   {
      ...
   }
};
Re[2]: static and reference
От: Holms США  
Дата: 30.09.03 09:42
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А у тебя сверху по коду, часом, не написано "class std::vector;"?


Sort.h
#ifndef __SORT_H
#define __SORT_H

#include <vector>

class Sort{
private:
  Sort(){}
public:
  static void QuickSort(std::vector& v);
  static void QuickSort(std::vector& v, int lo0, int hi0);
};

#endif


Sort.cpp
#include "sort.h"

void Sort::QuickSort(std::vector &v, int lo0, int hi0)
{
}
//----------------------------------------------------------------------
void Sort::QuickSort(std::vector& v)
{
  Sort::QuickSort(v, 0, v.size() - 1);
}


Больше ничего нету
... << RSDN@Home 1.1 beta 2 >>
The life is relative and reversible.
Re[2]: static and reference
От: Holms США  
Дата: 30.09.03 09:42
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Holms, Вы писали:



H>>в чем я неправ?


B>А какой тип имеет v?


B>Быть может нужно так?


Вы абсолютно правы
... << RSDN@Home 1.1 beta 2 >>
The life is relative and reversible.
Re[3]: static and reference
От: Bell Россия  
Дата: 30.09.03 10:01
Оценка:
Здравствуйте, 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. дополнительный вопрос
От: _Nomad  
Дата: 30.09.03 15:49
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

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*) никак не воспринимает....
Re[3]: static and reference. дополнительный вопрос
От: Анатолий Широков СССР  
Дата: 30.09.03 19:52
Оценка:
Смотрите в сторону boost::any.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.