STL源码剖析中allocator类运行在vs2010上

《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);
		}
	};

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值