随笔-15  评论-18  文章-9  trackbacks-0
         最近在写一个template与析构函数有关的东西,碰到了一个比较自己不怎么能理解的问题。我写了如下两个模板函数
 1     template< typename T, typename Alloc> 
 2     T* air_new_t()
 3     {
 4         return    new ( Alloc::allocBytes( sizeof( T ) )) T;
 5     }
 6 
 7     template< typename T, typename Alloc>
 8     void air_delete_t(T* ptrBase)
 9     {
10         if (ptrBase)
11         {
12             ptrBase->~T();
13             Alloc::deallocBytes( ( void* ) ptrBase );
14         }
15     }
然后在main函数中这使用这两个模板函数
1     int* ptr = air_new_t<int, CMemoryNedAlloc>();
2     *ptr = 10;
3     cout<<*ptr<<endl;
4     air_delete_t<int, CMemoryNedAlloc>(ptr);
以我的理解这应该是要编译错误的,因为ptr ->~int();在vs上是明显不行的。但是奇怪的是程序正常的运行了,当是基本类型时
ptrBase->~T()语句会跳过,如果是自己定义的类型则会调用
ptrBase->~T()。可以肯定的是模板函数会对基本类型的虚构函数进行特殊的处理,但是如何处理,是以何种规则处理呢?这些我都不明白,问了其他人,和网上查了些但还是太明白,这里也提到了相关的东西,但是我还是不太明白。模板函数不能特化,这样也正好达到了我的目的,原本还想这用特化来处理基本类型呢。不过虽然可以达到目的,到时其中的规则和原因不太明,心里也是没啥底。应该c++的文档里有提及,但是还没怎么查过文档呢,这个东西找起来可能要花些时间,特此记录一下,等找到说明再补上。
posted on 2011-07-21 22:45 木华 阅读(945) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理