《STL源码剖析》第二章的代码敲了一遍(Linux运行正常),在windows上出现以下错误:
d:\program files\microsoft visual studio 10.0\vc\include\vector(454): error C2664: 'JJ::allocator<T>::allocator(const JJ::allocator<T> &)' : cannot convert parameter 1 from 'JJ::allocator<T>' to 'const JJ::allocator<T> &'
1> with
1> [
1> T=std::_Container_proxy
1> ]
1> and
1> [
1> T=int
1> ]
1> and
1> [
1> T=std::_Container_proxy
1> ]
1> Reason: cannot convert from 'JJ::allocator<T>' to 'const JJ::allocator<T>'
1> with
1> [
1> T=int
1> ]
1> and
1> [
1> T=std::_Container_proxy
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1> d:\program files\microsoft visual studio 10.0\vc\include\vector(452) : while compiling class template member function 'std::_Vector_val<_Ty,_Alloc>::~_Vector_val(void)'
1> with
1> [
1> _Ty=int,
1> _Alloc=JJ::allocator<int>
1> ]
1> d:\program files\microsoft visual studio 10.0\vc\include\vector(481) : see reference to class template instantiation 'std::_Vector_val<_Ty,_Alloc>' being compiled
1> with
1> [
1> _Ty=int,
1> _Alloc=JJ::allocator<int>
1> ]
1> e:\快盘\炸金花\程序\stl\stl\allocator.cpp(11) : see reference to class template instantiation 'std::vector<_Ty,_Ax>' being compiled
1> with
1> [
1> _Ty=int,
1> _Ax=JJ::allocator<int>
1> ]
1>
1>Build FAILED.
原因是,windows的编译器用到了allocator不同类型的拷贝,所以只需写上拷贝构造函数就可以。
#pragma once #include<cstddef> namespace JJ { template<class T> inline T* _allocate(ptrdiff_t size , T*) { set_new_handler(0); T *tmp = (T *)(::operator new ((size_t)(size*sizeof(T)))); if(tmp==0) { // cerr<"out of memory"<<endl; exit(1); } return tmp; } template<class T> inline void _deallocate(T *buffer) { ::operator delete(buffer); } template<class T1,class T2> inline void _construct(T1 *p,const T2& value) { new(p) T1(value); } template <class T> inline void _destory(T *ptr) { ptr->~T(); } template <class T> class allocator { public: typedef T value_type; typedef T* pointer; typedef const T* const_pointer; typedef T& reference; typedef const T& const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; template <class U> struct rebind { typedef allocator<U> other; }; allocator() { return ; } template <class U> allocator(const allocator<U>& c ) { } pointer allocate(size_type n,const void *hint=0) { cout<<n<<endl; return _allocate((difference_type)n,(pointer)0); } void deallocate(pointer p,size_type n) { _deallocate(p); } void construct(pointer p,const T& value) { _construct(p,value); } void destroy(pointer p) { _destory(p); } pointer address(reference x) { return (pointer)&x; } const_pointer const_address(const_reference x) { return (const_pointer)&x; } size_type max_size() const { return size_type(0xffffffff/sizeof(T)); // return size_type(0); } }; }