не компилится такое
От: carpenter Голландия  
Дата: 10.06.11 13:53
Оценка:
template <class T>
class vallocator:public std::allocator<T>
{
        pointer allocate(size_type _Count)
        {    
          return CoTaskMemAlloc(_Count);
        }
        void deallocate(pointer _Ptr, size_type)
        {    
          CoTaskMemFree(_Ptr);
        }

};
class shared_tree_node
{
    //shared_tree_node(){};
public:
    static shared_tree_node * CreateInstance() { return (shared_tree_node*)CoTaskMemAlloc(sizeof(shared_tree_node));};
    std::vector<shared_tree_node,vallocator<shared_tree_node> >  childs;
    //std::basic_string< wchar_t,std::char_traits<wchar_t>,vallocator<wchar_t> > name;
    shared_tree_node * AddChild(LPWSTR nm)
    {
        shared_tree_node nd;
        //nd.name = name;
    ругается здеся     childs.push_back(std::vector<shared_tree_node,vallocator<shared_tree_node> >::value_type(nd));
        //return &(*(childs.end()-1));
    }


};


ошибка такая Error 3 error C2664: 'std::_Vector_val<_Ty,_Alloc>::_Vector_val(_Alloc)' : cannot convert parameter 1 from 'const std::allocator<_Ty>' to 'vallocator<T>' c:\program files\microsoft visual studio 8\vc\include\vector 487

не понимаю , вроде аллокатор я ему подсунул в качестве параметра шаблона , че он там конвертить то еще хочет ?
Весь мир — Кремль, а люди в нем — агенты
Re: не компилится такое
От: collider  
Дата: 10.06.11 19:29
Оценка: 4 (1)
Здравствуйте, carpenter, Вы писали:



C>
C>template <class T>
C>class vallocator:public std::allocator<T>
C>{
C>        pointer allocate(size_type _Count)
C>        {    
C>          return CoTaskMemAlloc(_Count);
C>        }
C>        void deallocate(pointer _Ptr, size_type)
C>        {    
C>          CoTaskMemFree(_Ptr);
C>        }

C>};
C>class shared_tree_node
C>{
C>    //shared_tree_node(){};
C>public:
C>    static shared_tree_node * CreateInstance() { return (shared_tree_node*)CoTaskMemAlloc(sizeof(shared_tree_node));};
C>    std::vector<shared_tree_node,vallocator<shared_tree_node> >  childs;
C>    //std::basic_string< wchar_t,std::char_traits<wchar_t>,vallocator<wchar_t> > name;
C>    shared_tree_node * AddChild(LPWSTR nm)
C>    {
C>        shared_tree_node nd;
C>        //nd.name = name;
C>    ругается здеся     childs.push_back(std::vector<shared_tree_node,vallocator<shared_tree_node> >::value_type(nd));
C>        //return &(*(childs.end()-1));
C>    }


C>};
C>


C>ошибка такая Error 3 error C2664: 'std::_Vector_val<_Ty,_Alloc>::_Vector_val(_Alloc)' : cannot convert parameter 1 from 'const std::allocator<_Ty>' to 'vallocator<T>' c:\program files\microsoft visual studio 8\vc\include\vector 487


C>не понимаю , вроде аллокатор я ему подсунул в качестве параметра шаблона , че он там конвертить то еще хочет ?


template<class _Other>
struct rebind
{ // convert an allocator<_Ty> to an allocator <_Other>
typedef vallocator<_Other> other;
};
в vallocator а то он этот rebind из allocator достает.
Re[2]: не компилится такое
От: carpenter Голландия  
Дата: 11.06.11 08:45
Оценка:
Здравствуйте, collider, Вы писали:

Спасибо ,

неисповедимы твои пути Господи

хотя странно , почему так .(т.е. вроде мой вариант по логике должен бы работать)
вопрос чисто академический , т.е. можно не отвечать.

C>template<class _Other>

C> struct rebind
C> { // convert an allocator<_Ty> to an allocator <_Other>
C> typedef vallocator<_Other> other;
C> };
C>в vallocator а то он этот rebind из allocator достает.
Весь мир — Кремль, а люди в нем — агенты
Re: подправленная и даже рабочая версия
От: carpenter Голландия  
Дата: 11.06.11 14:47
Оценка:
Здравствуйте, carpenter, Вы писали:

Вдруг кому пригодится

template <class T>
class vallocator:public std::allocator<T>
{
public:
        pointer allocate(size_type _Count)
        {    
          return (pointer)CoTaskMemAlloc(_Count * sizeof(T));
        }
        void deallocate(pointer _Ptr, size_type)
        {    
          CoTaskMemFree(_Ptr);
        }
        pointer allocate(size_type _Count, const void _FARQ *)
        {    
          return (pointer)CoTaskMemAlloc(_Count * sizeof(T));
        }
        void construct(pointer _Ptr, const T& _Val)
        {    
            new(_Ptr) T(_Val);
        }
        

template<class _Other>
struct rebind
{    
    typedef vallocator<_Other> other;
};

};
class shared_tree_node
{
    shared_tree_node(){};
public:
    void* operator new(size_t, void* p){return (p);};
    void operator delete(void*){};
    static shared_tree_node * CreateInstance() 
    { 
        shared_tree_node * res;
        res = (shared_tree_node*)CoTaskMemAlloc(sizeof(shared_tree_node));
        new(res) shared_tree_node();
        return res;
    };
    std::vector<shared_tree_node,vallocator<shared_tree_node> >  childs;
    std::basic_string< wchar_t,std::char_traits<wchar_t>,vallocator<wchar_t> > name;
    shared_tree_node * AddChild(LPWSTR nm)
    {
        shared_tree_node nd;
        nd.name = nm;

        childs.push_back(nd);
        return (&(childs[childs.size()-1]));
    }


};
Весь мир — Кремль, а люди в нем — агенты
Re[2]: подправленная и даже рабочая версия
От: const_volatile  
Дата: 11.06.11 15:44
Оценка:
Здравствуйте, carpenter, Вы писали:

C>
C>        return (&(childs[childs.size()-1]));
C>


в std::vector для этого есть back().
Re[3]: подправленная и даже рабочая версия
От: carpenter Голландия  
Дата: 12.06.11 06:22
Оценка:
Здравствуйте, const_volatile, Вы писали:

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


C>>
C>>        return (&(childs[childs.size()-1]));
C>>


_>в std::vector для этого есть back().


не пойдет — back возвращает ссылку , а мне нужно указатель вернуть,
тут есть еще вариант — childs.end() — 1
Весь мир — Кремль, а люди в нем — агенты
Re[4]: подправленная и даже рабочая версия
От: Centaur Россия  
Дата: 12.06.11 08:29
Оценка: 1 (1) +1 :)
Здравствуйте, carpenter, Вы писали:

C>>>        return (&(childs[childs.size()-1]));


_>>в std::vector для этого есть back().


C>не пойдет — back возвращает ссылку , а мне нужно указатель вернуть,


Ну так и сделай указатель: return &children.back(); (И да, множественное число от child пишется именно так.)

C>тут есть еще вариант — childs.end() — 1


Это даст итератор, а он не обязан быть указателем. И на современных реализациях стандартной библиотеки и не является.
Re[4]: подправленная и даже рабочая версия
От: Mr.Delphist  
Дата: 14.06.11 12:54
Оценка:
Здравствуйте, carpenter, Вы писали:

C>не пойдет — back возвращает ссылку , а мне нужно указатель вернуть,

C>тут есть еще вариант — childs.end() — 1

Возможно, будет интересно
http://stackoverflow.com/questions/5322104/how-portable-is-end-iterator-decrement

// From VC++'s <list> implementation
  reference back()
     {
    // return last element of mutable sequence
     return (*(--end()));
     }

  const_reference back() const
     {
    // return last element of nonmutable sequence
     return (*(--end()));
     }

Re[4]: подправленная и даже рабочая версия
От: rg45 СССР  
Дата: 15.06.11 05:36
Оценка:
Здравствуйте, carpenter, Вы писали:

C>>>
C>>>        return (&(childs[childs.size()-1]));
C>>>


_>>в std::vector для этого есть back().


C>не пойдет — back возвращает ссылку , а мне нужно указатель вернуть,


Оператор индексирования (operator[]) тоже возвращает ссылку, что не помешало тебе в конечном итоге вернуть указатель


C>тут есть еще вариант — childs.end() — 1


Не вариант. Тип итератора зависит от реализации и не обязан быть указателем. Во некоторых реализациях STL (STLport, например) тип итератора зависит от конфигурации проекта: в release — указатель, в debug — объект класса.
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.