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
не понимаю , вроде аллокатор я ему подсунул в качестве параметра шаблона , че он там конвертить то еще хочет ?
Весь мир — Кремль, а люди в нем — агенты
Здравствуйте, 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]: не компилится такое
Здравствуйте, 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, Вы писали:
Вдруг кому пригодится
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]: подправленная и даже рабочая версия
Здравствуйте, carpenter, Вы писали:
C>C> return (&(childs[childs.size()-1]));
C>
в std::vector для этого есть back().
Re[3]: подправленная и даже рабочая версия
Здравствуйте, const_volatile, Вы писали:
_>Здравствуйте, carpenter, Вы писали:
C>>C>> return (&(childs[childs.size()-1]));
C>>
_>в std::vector для этого есть back().
не пойдет — back возвращает ссылку , а мне нужно указатель вернуть,
тут есть еще вариант — childs.end() — 1
Весь мир — Кремль, а люди в нем — агенты
Re[4]: подправленная и даже рабочая версия
Здравствуйте, carpenter, Вы писали:
C>>> return (&(childs[childs.size()-1]));
_>>в std::vector для этого есть back().
C>не пойдет — back возвращает ссылку , а мне нужно указатель вернуть,
Ну так и сделай указатель: return &children.back(); (И да, множественное число от child пишется именно так.)
C>тут есть еще вариант — childs.end() — 1
Это даст итератор, а он не обязан быть указателем. И на современных реализациях стандартной библиотеки и не является.
Re[4]: подправленная и даже рабочая версия
Здравствуйте, 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 — объект класса.
--
Не можешь достичь желаемого — пожелай достигнутого.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить