??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久久国产精品美女,久久人妻无码中文字幕,国产精品99久久久精品无码http://www.shnenglu.com/shanoa/category/10678.html其实我更爱姐?..zh-cnFri, 16 Sep 2011 05:40:15 GMTFri, 16 Sep 2011 05:40:15 GMT60boost::asio|络传输错误码的一些实验结果(recv error_codeQ?/title><link>http://www.shnenglu.com/shanoa/archive/2011/05/06/145840.html</link><dc:creator>酿妹?/dc:creator><author>酿妹?/author><pubDate>Fri, 06 May 2011 10:06:00 GMT</pubDate><guid>http://www.shnenglu.com/shanoa/archive/2011/05/06/145840.html</guid><wfw:comment>http://www.shnenglu.com/shanoa/comments/145840.html</wfw:comment><comments>http://www.shnenglu.com/shanoa/archive/2011/05/06/145840.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/shanoa/comments/commentRss/145840.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shanoa/services/trackbacks/145840.html</trackback:ping><description><![CDATA[错误码很重要Q可以由此判断网l连接到底发生了马事情Q从而驱动高层逻辑的行为。只有笼l的错误码判断的|络层是不够规范的,鄙h觉得有些错误码还是需要在|络层就区分开的,Ҏ(gu)记录一些当前实验的错误码以及发生原因?br /><br />以下是一部分在async_receive()的handler处捕获到的比较有用的错误?br /> <table style="width: 756px; border-collapse: collapse; height: 222px" border="1" cellpadding="3" cellspacing="0"> <tbody> <tr> <td style="width: 132px">错误码(十进Ӟ</td> <td style="width: 231px; height: 24px">枚D</td> <td>发现原因</td> </tr> <tr> <td>10009</td> <td>boost::asio::error::bad_descriptor</td> <td>在一个已l关闭了的套接字上执行async_receive()</td> </tr> <tr> <td>995</td> <td>boost::asio::error::operation_aborted</td> <td>正在async_receive()异步d{待Ӟ本端关闭套接?/td> </tr> <tr> <td>10054</td> <td>boost::asio::error::connection_reset</td> <td>正在async_receive()异步d{待Ӟq端的TCP协议层发送RESETl止链接Q暴力关闭套接字。常常发生于q端q程强制关闭Ӟ操作pȝ释放套接字资源?/td> </tr> <tr> <td>2</td> <td>boost::asio::error::eof</td> <td>正在async_receive()异步d{待Ӟq端关闭套接字,q里?0054发生的情况似乎一P但是实际上应该是有区别的Q具体神马区别,由回复中jack的说法,q个是远端正常关闭套接字?/td> </tr> </tbody> </table> 只是一些浅陋的试Q目前觉得有用的也就是这几个Q不正确的地方请送我鸡蛋?img src ="http://www.shnenglu.com/shanoa/aggbug/145840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shanoa/" target="_blank">酿妹?/a> 2011-05-06 18:06 <a href="http://www.shnenglu.com/shanoa/archive/2011/05/06/145840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OGRE与MFC的文件系l冲H问?/title><link>http://www.shnenglu.com/shanoa/archive/2010/12/29/137693.html</link><dc:creator>酿妹?/dc:creator><author>酿妹?/author><pubDate>Wed, 29 Dec 2010 12:49:00 GMT</pubDate><guid>http://www.shnenglu.com/shanoa/archive/2010/12/29/137693.html</guid><wfw:comment>http://www.shnenglu.com/shanoa/comments/137693.html</wfw:comment><comments>http://www.shnenglu.com/shanoa/archive/2010/12/29/137693.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/shanoa/comments/commentRss/137693.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shanoa/services/trackbacks/137693.html</trackback:ping><description><![CDATA[<p>q两个东西在一起问题真呀么多......前些日子才写的一个注意事的随笔Q这回又有问题需要记录,好吧Q开新文写?br>问题Q由于项目的复杂度,问题的表C原因其实相差十万八千里?br>原因QMFC在打开和保持文件后Q即打开CFileDialog对话框后Q,׃修改q程的当前目录,是SetCurrentDirectoy()Q导致OGRE里那些用相对路径做Location的资源目录下的文件全部无法读取(其实我觉得OGRE应该把这些相对目录在d文g的时候换成绝对目录)。具体就是openResource()中调用stat()出错Q文件系l中找不到指定文件?br>解决Ҏ(gu)Q在合适的地方调用SetCurrentDirectoy()把进E当前目录设|回q程工作目录?.....</p> <p>于是又是一下午+半个晚上的调试时?.....<br></p> <img src ="http://www.shnenglu.com/shanoa/aggbug/137693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shanoa/" target="_blank">酿妹?/a> 2010-12-29 20:49 <a href="http://www.shnenglu.com/shanoa/archive/2010/12/29/137693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>备忘随笔pd2Q内存错?/title><link>http://www.shnenglu.com/shanoa/archive/2010/12/23/137336.html</link><dc:creator>酿妹?/dc:creator><author>酿妹?/author><pubDate>Thu, 23 Dec 2010 15:41:00 GMT</pubDate><guid>http://www.shnenglu.com/shanoa/archive/2010/12/23/137336.html</guid><wfw:comment>http://www.shnenglu.com/shanoa/comments/137336.html</wfw:comment><comments>http://www.shnenglu.com/shanoa/archive/2010/12/23/137336.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/shanoa/comments/commentRss/137336.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shanoa/services/trackbacks/137336.html</trackback:ping><description><![CDATA[接上?strong>《备忘随W系?QMFC与OGRE联姻注意事项?/strong>之后Q再记录一下内存错误,l过无数ơ莫名其妙的内存问题之后Q发C些找不着北的内存Crash问题出现的原因都很荒谬,所以本主要例举一下近期出现的一些怪异内存问题和让人啼W皆非的原因所在?br><br><strong>问题1Q?/strong>~译器在~译那些讉K成员变量的代码时错了相对于this指针的偏Ud节数Q赋值给下面一个变量时Q却修改了上面一个变量的倹{?br>原因Q与我共事的某位大仙׃L使用l构体传递网l包Q所以在某头文g里用#pragma pack(1)包括住了整个头文Ӟ一不小心把#include "其他头文?那些行也l包括了q去Q其中不乏Windows.h  stl云云......<br>解决办法Q当焉个啥......?pragma pack(1)的位|往下去几行Q还是细心点?..费了整整一天调试?br><br><strong>问题2Q?/strong>从网l另一端机器发q来一个结构体Q分别接收一个结构体中的多个数据成员和一ơ性接收整个结构体取出的数据不同?br>原因Q这是个?的情形,两个相同的结构体分别在不同的头文件中Q且一个有#pragma pack(1)Q一个没有?br>解决办法Q如果要用结构体传递网l包Q还是共用头文g?.....<br><br>其实......很多内存问题很不好描qͼ我也不经常出现如上那Ll的问题Q所以下面我q是说一个最常见的内存问题(0x.....地址讉K冲突Q和原因吧:<br>“0x.....地址讉K冲突”q个Crash基本上每个h都遇刎ͼ而且l常遇到Q但是大部分都很Ҏ(gu)解决。判断问题的原因可以看这几点Q?br>原因1Q如?x....q个值很,一般就?大一些,而且是在讉K某对象中的数据成员时出错的,那么q基本都是因对象指针为空Q你用了I对象指针调用了代码?br>原因2Q如?x...值同样很,但是q在访问某对象中的数据成员时出错,而是调用某函数那一行时出错的,那么q个函数十有八九(ji)是个虚函敎ͼ如果我说中的话,那原因应该如前面的原?相同Q只是这回是d虚函数表时就崩了?br>原因3Q如?x...值类似是0xcdcdcdcd?xeeeccc或者与q相q的敎ͼ且同h在访问数据成员或调用虚函数的时候出的问题,那么q就是个野指针问题了,释放了就别再用啊?br>原因4Q内存越界,q个对程序造成的麻烦比Mȝ都要大,但是问题q不隐蔽Q记得ؓ每个cȝ数据成员q行必要的初始化?br>原因5Q用了memset或ZeroMemory清空一些对象或对象数组。特别是对象数组Q很Ҏ(gu)让h忽略q个问题。有些程序员会觉得某对象里都是可以这hI的数据成员Q所以便q样做了Q但是往往虚函数表指针会被忽略Q这个指针绝对不能一赯清空的?br>ȝQ不要让表达索引的整形在初始化后是个未知|不要让指针没有在初始化时被赋0|不要不检查指针的值就拿它讉K成员函数和成员数据;不要重复释放指针所指对象;不要使用释放后和未初始化的内存数据;可以的话使用指针Q释放指针所指地址后,为指针赋0|只有在完全是内部cd构成且没有多态的cd对象上用memset为对象赋倹{?br> <img src ="http://www.shnenglu.com/shanoa/aggbug/137336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shanoa/" target="_blank">酿妹?/a> 2010-12-23 23:41 <a href="http://www.shnenglu.com/shanoa/archive/2010/12/23/137336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>备忘随笔pd1QMFC与OGRE联姻注意事项http://www.shnenglu.com/shanoa/archive/2010/12/23/137249.html酿妹?/dc:creator>酿妹?/author>Wed, 22 Dec 2010 17:39:00 GMThttp://www.shnenglu.com/shanoa/archive/2010/12/23/137249.htmlhttp://www.shnenglu.com/shanoa/comments/137249.htmlhttp://www.shnenglu.com/shanoa/archive/2010/12/23/137249.html#Feedback6http://www.shnenglu.com/shanoa/comments/commentRss/137249.htmlhttp://www.shnenglu.com/shanoa/services/trackbacks/137249.html
本文记录最q发现的一?MFC ?OGRE1.7.2版本 联姻的注意事:

问题1Q?/strong>创徏Ogre的CViewH口后,无法截获鼠标点击和移动信息,只能获取鼠标滚轮信息?br>原因及解x案:传递CViewH口句柄Ӟ请一定用externedWindowHandle的属性keyQ切C要用parentWindowHandleQ因为parentWindowHandle是让CView成ؓ渲染H口的父H口Q鼠标键盘消息都不会路由到CView上,而是在渲染窗口里被截P而externedWindowHandle是让CViewH口本n成ؓ渲染H口Q所以CView才能正常截获到输入消息?br>
问题2Q?/strong>当解决问?之后Q发C用externedWindowHandlel制出的H口很小Q而用parentWindowHandle时则正常
原因及解x案:注意l承CView::OnSize()函数响应WM_SIZE消息Q但请切讎ͼ千万别在OnSize中调用Ogre::RenderWindow::resize()函数Q这会导致OnSize()函数的递归回调Q因为Ogre::RenderWindow::resize()函数中会调用AdjustWindow()和SetWindowPos()函数Q这会导致发送WM_SIZE消息q羃?yu)窗口,从而导致问题的发生?br>
问题3Q?/strong>如何解决H口重置大小的问?br>解决Ҏ(gu)Q在OnSize()?span style="COLOR: red">不能调用Ogre::RenderWindow::resize()函数Q?strong style="COLOR: red">应该调用Ogre::RenderWindow::windowMovedOrResized()函数Q通知RenderWindow在渲染前重新讄Viewport的宽高比例?br>
问题4Q?/strong>怎样保L染@?br>分析Q上|看了一些相关的解决Ҏ(gu)Q发现大多用WM_TIMER消息来维持OGRE的主渲染循环Q这应该是下下策的方案了?.....当然q有其他的实现方案,譬如开另一个线E,q个Ҏ(gu)q是可行的,但是L些不对味Q因为渲染明明应该在ȝE中才是最x案。于是我q了一下MFC闲下来的时候都q了些什么,最后发C以下解决Ҏ(gu)Q应该算是很不错但ƈ不难的解军_法了Qؓ什么没见网上有人提供这LҎ(gu)让我很不理解Q窝着藏着也得不到半点好处Q?br>解决Ҏ(gu)Q用空闲回调。该回调是需要承CWinApp::OnIdle()函数Q好像是叫这个,反正肯定带Idleq个单词Q,当主U程中的消息循环没有取到消息Ӟ调用PeekMessage()没有获取到消息)Q就会去调用q个函数Q于?.....在q个函数里调用绘制一帧吧QOgre::RenderWindow::update()Q另外有动画的话q需要调用Ogre::Root::_fireFrameRenderingQueued()Q因为动L新在q里。如果是惌所有渲染对象都更新一帧的话,直接调用Ogre::Root::renderOneFrame()吧?br>
解决Ҏ(gu)不一定最好,也不一定适合你的情况Q但愿能微薄之力,也是作ؓ我个人的备忘吧?

]]>
关于MVC PropertySet OperatorStack的一些设计思?/title><link>http://www.shnenglu.com/shanoa/archive/2010/11/20/134166.html</link><dc:creator>酿妹?/dc:creator><author>酿妹?/author><pubDate>Sat, 20 Nov 2010 11:30:00 GMT</pubDate><guid>http://www.shnenglu.com/shanoa/archive/2010/11/20/134166.html</guid><wfw:comment>http://www.shnenglu.com/shanoa/comments/134166.html</wfw:comment><comments>http://www.shnenglu.com/shanoa/archive/2010/11/20/134166.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/shanoa/comments/commentRss/134166.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shanoa/services/trackbacks/134166.html</trackback:ping><description><![CDATA[最q在l公叔R码一个场景编辑器Q大致得实现的功能有Q?br>地Ş高度?br>地ŞU理?br>攄物件和房屋<br>攄_子pȝ<br>讄路径点和只能摄像机点<br><br>是个简单的不能再简单的场景~辑器了?..但是q样的一个工兯是很头痛的,特别是用C++来写...<br>头痛的原因不是别的,正是q个表现层和后台数据同步问题。这个在C++的UI库中目前q真没有什么现成的好办法,于是开始造轮子,为MFC写了PropertySet和OperatorStack?br>首先q个UI数据和内存数据双向同步的问题直接让我崩溃?..׃以前写过一些工P知道q东西如果不做个设计开始冲着功能写的话会有什么后果。嗯Q于是承封装了CMFCPropertyGridCtrl控gQؓ每个叶子属性项装了一个LeafItemQ根据属性名来更新PropertySet里对应的数据......具体实现几千字略- - 最l成型时代码q样Q?br>DynamicObject obj;<br>propertyGrid.attachObject(obj);<br>q里的DynamicObjectl承PropertySetQ于是propertyGrid控g׃昄obj里所有的属性数据了...然后是双向更新问题,目前是给Property里加了一个eventValueChanged事g响应Q让PropertyGridCtrl监听q些数据的变化,而propertyGridCtrlq个UI上的数据变化同样是派生实现CMFCPropertyGridCtrl的值变化响应函数来l绑定的LeafItem更新数据Q也是直接就h到Property里了?br>q有OperatorStack.....q个是操作栈Q记录用h作的Q用于撤销和重做的操作Q也用到了PropertySet来记录变化对象的属性快照,嗯,叫SnapShootRecord的类里面记录的都是一个对象的变化属性?br>先就记录q么多,很ؕ很不Ҏ(gu)懂,主要l我自己做个记录的,没啥贡献Q实际上q有很多不好用的地方Q所以最q在想一些改q设计,{我惛_了放上来详细设计和源码吧.......<img src ="http://www.shnenglu.com/shanoa/aggbug/134166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shanoa/" target="_blank">酿妹?/a> 2010-11-20 19:30 <a href="http://www.shnenglu.com/shanoa/archive/2010/11/20/134166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>l于完成了自q模板设计Q初步实Cfilter_streambufQcge目启动......http://www.shnenglu.com/shanoa/archive/2010/10/12/129640.html酿妹?/dc:creator>酿妹?/author>Tue, 12 Oct 2010 11:37:00 GMThttp://www.shnenglu.com/shanoa/archive/2010/10/12/129640.htmlhttp://www.shnenglu.com/shanoa/comments/129640.htmlhttp://www.shnenglu.com/shanoa/archive/2010/10/12/129640.html#Feedback4http://www.shnenglu.com/shanoa/comments/commentRss/129640.htmlhttp://www.shnenglu.com/shanoa/services/trackbacks/129640.html实现的目的是Z在一些特定情况下不去使用boost的filter_streambufQ不使用boost::iostreams的理由如下:
1、基于运行时配置的过滤器Q效率稍?br>2、对于网l通讯而言Qboost的filter_streambuf乃至整个iostreams库都昑־较ؓ臃肿?br>所以,我自q写了一套filter_streambufQ承了std::streambufQƈ配合自己重新设计的archive和batch_dataq行|络通讯Q无论是效率q是易用性上都超Z用boost的iostreams。而boost的那套东西经q我的反复用后Q觉得更适合用在文gd和数据持久化上?br>如果要说哪里不如boost的filter_streamQ也是boost的filter_streambuf可以动态配|filterQ而我使用的是模板技术将filter的关pd~译期就兌了v来,所以只能是静态配|filter。下面是具体使用时的完整例子代码Q?br>
 1 #include <ccs/util/ios/ifilter_streambuf.hpp>
 2 #include <ccs/util/ios/ofilter_streambuf.hpp>
 3 #include <ccs/util/ios/memory_terminal.hpp>
 4 
 5 using namespace ccs;
 6 using namespace util;
 7 
 8 // 输出qo
 9 struct my_ofilter
10 {
11     typedef ios::ofilter_tag tag_type;
12 
13     template<typename OutT>
14     std::streamsize write(const char* p, std::streamsize n, OutT& _out)
15     {
16         std::streamsize i = 0;
17         for (; i < n; ++i)
18         {
19             char c = p[i];
20             if (_out.write(&++c, 1!= 1)
21                 break;
22         }
23         return i;
24     }
25 };
26 
27 // 输入qo
28 struct my_ifilter
29 {
30     typedef ios::ifilter_tag tag_type;
31 
32     template<typename InT>
33     std::streamsize read(char* p, std::streamsize n, InT& _in)
34     {
35         std::streamsize i = 0;
36         for (; i < n; ++i)
37         {
38             char c;
39             if (_in.read(&c, 1!= 1)
40                 break;
41             p[i] = --c;
42         }
43         return i;
44     }
45 };
46 
47 // 输出内存讑֤
48 struct memory_odevice
49 {
50     typedef ios::dest_tag tag_type;
51 
52     std::streamsize write(const char* p, std::streamsize n, ios::memory_oterminal& _out)
53     {
54         return _out.write(p, n);
55     }
56 };
57 
58 // 输入内存讑֤
59 struct memory_idevice
60 {
61     typedef ios::source_tag tag_type;
62 
63     std::streamsize read(char* p, std::streamsize n, ios::memory_iterminal& _in)
64     {
65         return _in.read(p, n);
66     }
67 };
68 
69 
70 int main(int _Argc, char** _Args)
71 {
72     char buf[256];
73     ios::memory_oterminal memout(buf, 256);
74     ios::memory_iterminal memin(buf, 256);
75     ios::ifilter_streambuf<ios::memory_iterminal, mpl::list2<my_ifilter, memory_idevice> > insbuf(&memin);
76     ios::ofilter_streambuf<ios::memory_oterminal, mpl::list2<my_ofilter, memory_odevice> > outsbuf(&memout);
77     std::istream is(&insbuf);
78     std::ostream os(&outsbuf);
79 
80     int num = 188;
81     os.write((char*)&num, sizeof(int));
82     os.flush();
83     is.read((char*)&num, sizeof(int));
84 
85     std::cout << num << std::endl;
86     system("pause");
87 }

代码中的意思就是将写入的数据逐字节的?Qƈ保存在内存缓冲里Q然后又从内存缓冲中dQ逐字节减1Qƈ输出到控制台Q一套经q过滤的d便完成了。由于用了模板元的list作ؓ链接Q在release模式下所有的qo器操作都是内联的Q这虽然也是我预想的效果Q但看完汇编码之后,着实让我高兴了一晚上Q这U成感真的是programer最大的乐趣?/p>

需要说明的是:代码中的mpl::list2是自己实现的模板元链?..q段旉考虑研究一下boost的ƈ替换q来Q因为那个list后面?让我觉得很不够智?..当然Q如果boost的list实现q于复杂Q或是不能让我的代码完全内联化的话,肯定不会考虑使用?br>
完成q个之后Q我便准备着手构建cge目Q所谓的cgeQ就是cloud game engine的羃?..֐思义是使用了云技术的游戏引擎Q我惛_业余旉试一些颠覆传lcs架构的在U游戏引擎架构设计,具体隄估计会有2个:
1、运用gpgpu group的ƈ行运技术,考虑使用目前市场占用率最大的nvidia tesla服务器配合cudaQ在服务器用physX实现一定的物理模拟?br>2、在x性较强的在线游戏中,pingg直是最大的挑战Q所以有选择性的使用云计技术,q是架构设计上的挑战?br>关于cge的设计思考和规划Q会另外开贴具体阐qͼq记录开发进度和情况?/span>



]]>
析构q程中内存相关错误的l大多数原因http://www.shnenglu.com/shanoa/archive/2010/07/01/119064.html酿妹?/dc:creator>酿妹?/author>Thu, 01 Jul 2010 07:47:00 GMThttp://www.shnenglu.com/shanoa/archive/2010/07/01/119064.htmlhttp://www.shnenglu.com/shanoa/comments/119064.htmlhttp://www.shnenglu.com/shanoa/archive/2010/07/01/119064.html#Feedback10http://www.shnenglu.com/shanoa/comments/commentRss/119064.htmlhttp://www.shnenglu.com/shanoa/services/trackbacks/119064.html今天记录一下长久以来屡ơ犯的错Q每ơ都是换一U方法编码来l过q个问题实现功能的,因ؓq个问题太过隐蔽Q导致今天才发现其中真正的原?..下面q行问题描述Q?br>
1std::map<std::string, Value> keyValue; // 在函数内部分配的堆栈对象Q局部变量)
2ReadData(keyValue);// 从dll中导出的函数
3keyValue.clear(); // delete中出现assert异常

W一行是在应用程序中的堆栈中分配的内存空间?br>W二行是我自己写的dll库,用来d一些数据加入到keyValue中?br>W三行是清空keyValueQ其实如果不写这一行的话,keyValue也会在函数结时清空Q到那时同样会出现错误?br>q一切乍一看没啥问题,keyValue是局部变量,Z么局部变量的释放会出现异帔R误呢Q这是因为第二行ReadData的缘故。ReadData的逻辑在另外一个可执行模块中,在其中分配的内存I间不一定与当前模块在同一个堆区?br>我们知道Qstd::map是一个树l构的容器,我在ReadData内部往keyValue中添加了数据QkeyValue中会在堆Z分配树节点,而这个节点将会在当前模块在keyValue的析构中被释放。也是_我无意中在dll模块中分配了堆空_又无意中在exe模块中企N放该I间Q这L行ؓD错误是不ؓ怪的?br>时刻牢记Q在一个模块中分配和释攑֐一块内存区域,警惕你所看不见的内存分配和释放?/strong>

]]>
完成的网l数据包文档?/title><link>http://www.shnenglu.com/shanoa/archive/2010/04/24/113460.html</link><dc:creator>酿妹?/dc:creator><author>酿妹?/author><pubDate>Sat, 24 Apr 2010 12:34:00 GMT</pubDate><guid>http://www.shnenglu.com/shanoa/archive/2010/04/24/113460.html</guid><wfw:comment>http://www.shnenglu.com/shanoa/comments/113460.html</wfw:comment><comments>http://www.shnenglu.com/shanoa/archive/2010/04/24/113460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shanoa/comments/commentRss/113460.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shanoa/services/trackbacks/113460.html</trackback:ping><description><![CDATA[<p>好久没写blog了,q次初步完成了一个文档化的网l流框架Q这玩意儿是pp样叫Q但具体是啥玩意儿呢Q其实就是将|络通讯数据l构l串行化到缓冲里Q再发送到|络的另一端,由另一端再串行化到相应的类型对象里。恩Q这听v来没啥难度呀Q但事实q如此Q呵呵,该架构徏立在asio基础之上Q目前完成了tcp通讯部分Q基本可以很方便的用了?br>        为啥我要写这么个架子Q因为网l通讯需要考虑很多情况Q如_包、未接收完整、缓冲不够大{情况,而且在项目开发过E中Q不断的d和修改一些通信协议相关的数据包l构。ؓ了让E序员不要管那么多麻烦的情况Q同时易于修改和d新的通讯协议Q于是就写了q么个架构,不过今天比较忙,q是下次传上用例代码吧,源码可能会在不久以后发布的通用库模板库里找到?br>恩,p发布自己的一个开源库Q徏立在stl和boost基础上,可跨q_~译 0 0......<br>到时候再说了?/p> <img src ="http://www.shnenglu.com/shanoa/aggbug/113460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shanoa/" target="_blank">酿妹?/a> 2010-04-24 20:34 <a href="http://www.shnenglu.com/shanoa/archive/2010/04/24/113460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>装MySQL时解决的两个字符集问?/title><link>http://www.shnenglu.com/shanoa/archive/2009/10/09/98199.html</link><dc:creator>酿妹?/dc:creator><author>酿妹?/author><pubDate>Fri, 09 Oct 2009 14:29:00 GMT</pubDate><guid>http://www.shnenglu.com/shanoa/archive/2009/10/09/98199.html</guid><wfw:comment>http://www.shnenglu.com/shanoa/comments/98199.html</wfw:comment><comments>http://www.shnenglu.com/shanoa/archive/2009/10/09/98199.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/shanoa/comments/commentRss/98199.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shanoa/services/trackbacks/98199.html</trackback:ping><description><![CDATA[在我开始封装MySQL C APIӞ真的没有惌居然会在字符集问题上q箋卡壳Q折腾了一下午+一晚上Q终于搞定这些问题。下面记录一下我遇见的问题以及解军_法,以作备忘?br>首先遇见的当然是中文q问题。这个问题相Ҏ(gu)说资料比较多Q文档写得应该也是很清楚的,但是我没心思看Q靠猜搞定。我首先讄MySQL服务器的默认字符集ؓUTF8Qƈ保证我操作的表中的列字符集也是UTF8Q然后重启MySQL服务Qƈ试用mysql_query("INSERT INTO TestTable VALUES('你好')")来写入,l果p|在预料之中。我猜可能可以用类?INSERT INTO TestTable VALUES('\0x2734\0x3432')"q样的方式写入中文,但这样太丑了Q也没有实用价|我坚决不会去用。我又尝试用MultiByteToWideChardQ甚至用了Qt的QTextCodec去{?#8220;你好”q两个字Q结果依然失败。这有些蹊跷了Q我军_调用mysql_character_set_name()看看到底有没有正的讄成UTF8格式Q让我意料之外的是:l果是latin1Q这N是拉丁字W集Q?我查看了一下API函数的相兌明,发现q里获取到的是客L链接的字W集Q我H然觉得Q也许MySQL可以自动的在客户端与服务器之间的字符集进行{化!说做做Q我查到了可以用mysql_options()或者mysql_set_character_name()函数来设|客L链接字符集,但这两个函数用的时机分别在调用mysql_real_connect()之前或之后。我客L链接讄成gb2312字符集,q是VC中支持中文的标准字符集之一Q另一个标准是UTF16Q需要用wchar_t  wstring和常量字W串前的LQ,l果Q当然是非常正确的插入中文啦Q呵呵!<br>正当我觉得下面的装肯定会顺汤顺水之Ӟ在封装基本完成的时候,我发现控制台不能输出我从MySQL取出的中文了Q这太奇怪了Q输文就没有问题Q而中文虽然的被准确无误的读入了std::string中(通过单步调试和ofstream得到认Q,然而输出到cout中却会出错。ؓ什么文件流没问题,控制台流会出问题呢?我跟t了代码Q发现在fputc()函数中出C问题。另一个奇特的地方Q就是在mysql_init()函数被调用之前,cout可以正确输出中文Q但调用之后׃能输出,iostate被赋?|即badbit。我求了一下googleQ发现sputc()中的一个_nolock_write()函数是msvcrtd.lib中的函数Q晕了,我在单步调试中也发现是q里有问题,切的说Qmysql_init()函数被调用后Q_nolock_write()函数׃出错。哈哈,ȝZq些特点之后Q我已经隐约猜到了是哪里的问题了Q还记得前几日才写的blog里的东西Q我׃惌libmysql.lib换成mysqlclient.lib静态库Q所以便掉了msvcrtd.lib库,我肯定这里面有关联?br>到底是什么原因呢Q我觉得Q由于这个MySQL的SDK不是我自q译的Qmysqlclient.lib里面调用crt函数Ӟ对字W集的本地化做了讄Q由于是Ƨ美的字W集讄Q所以一旦我调用了mysqlclient.lib里的函数Q就无法再显CZ文了?br>猜出了问题的Ҏ(gu)Q那么如何解册个问题呢Q我可以肯定的是Q用std::cout.imbue(std::locale())是行不通的Q那么下面就是列出的几个办法Q?br>1、用h家编译好的动态库Qlibmysql.libQƈlibmysql.dll拯q来Q由于动态库和你的程序共享crt dllQ因此字W集讄应该会是一致的?br>2、如果你q是想用静态库Q可以考虑自己下蝲源码q编译一遍,q是Ҏ(gu)的解军_法?br>3、如果你可以自己~译Q且想用mysqlclient.libQ那么就重新~译mysqlclient吧,动态静态都可以。不q官|上下蝲的编译好的mysqlclient.lib是静态的Q不能用?br><br>我最l的解决办法是第1U,因ؓ比较懒,不想自己再去~译了,呵呵? <img src ="http://www.shnenglu.com/shanoa/aggbug/98199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shanoa/" target="_blank">酿妹?/a> 2009-10-09 22:29 <a href="http://www.shnenglu.com/shanoa/archive/2009/10/09/98199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>原来静态库是这样链接的http://www.shnenglu.com/shanoa/archive/2009/10/06/97972.html酿妹?/dc:creator>酿妹?/author>Tue, 06 Oct 2009 13:30:00 GMThttp://www.shnenglu.com/shanoa/archive/2009/10/06/97972.htmlhttp://www.shnenglu.com/shanoa/comments/97972.htmlhttp://www.shnenglu.com/shanoa/archive/2009/10/06/97972.html#Feedback0http://www.shnenglu.com/shanoa/comments/commentRss/97972.htmlhttp://www.shnenglu.com/shanoa/services/trackbacks/97972.html闲话不多_记录一些关键点Q首先是静态链接到底和动态链接有哪些不太Ҏ(gu)发现的区别呢Q我来假设libA依赖libBQ那么我的执行文件在使用libA的时候也需要导入libB才能正确链接Q但若dllA依赖libB的话Q则只需导入dllA可以。我在一开始用MySQL时用的内嵌数据库模式,所以导入的是那个libmysql.dll动态库Q因此没出现问题。而换上了mysqlclient.lib后,居然告诉我没有找到socket相关的实玎ͼ?#8220;无法解析的外部符?#8221;q类错误Q于是乎我只有加上ws2_32.lib库才能通过?br>Z么这栯计?原因其实跟静态库的连接方式有养I׃静态库直接函数实现和全局静态变量导入到包含它的执行体中Q所以在多层多重的库包含中就会有大量重定义的问题存在Q想想你在一个静态库中用了单件模式,那么其他库又包含你这个库Q最后exe又包含所有这些库Q最lŞ成菱形依赖,如果静态库不这栯计的话,问题׃像C++的多重扉K题一栗之所以静态库q样设计Q跟C++的虚拟承思想直如Z辙。(我知道这D话其实只有已经懂了的h才能看得懂,不过没办法,我表达能力挺W的...Q?br>
q有个极度郁L地方是:mysqlclient.lib中的libcmtd.lib和msvcrtd.libq对zd居然也被链接q去了,我这辚w先需要忽略这两个默认库,然后再包含msvcrtd.lib才可以。我不知道ؓ啥sdk提供的静态库非得在c runtime link的方式上跟一般hq不去,又懒得去自己~译Q哎Q将׃下就q么用吧......

]]>
异常处理的可恉?/title><link>http://www.shnenglu.com/shanoa/archive/2009/08/02/91967.html</link><dc:creator>酿妹?/dc:creator><author>酿妹?/author><pubDate>Sun, 02 Aug 2009 09:12:00 GMT</pubDate><guid>http://www.shnenglu.com/shanoa/archive/2009/08/02/91967.html</guid><wfw:comment>http://www.shnenglu.com/shanoa/comments/91967.html</wfw:comment><comments>http://www.shnenglu.com/shanoa/archive/2009/08/02/91967.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/shanoa/comments/commentRss/91967.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shanoa/services/trackbacks/91967.html</trackback:ping><description><![CDATA[也许q个错误是很q稚的,但是他着实难住了我好几个时Q一度我q以为永q解不开q个谜题?*o*)Q情冉|q样的,异常在抛Z后,到达处理异常的catch域,但这时上下文必须依然有效才行Q否则catch接收不到抛出的异常。具体代码如下:<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_6_454_Open_Image onclick="this.style.display='none'; Codehighlighter1_6_454_Open_Text.style.display='none'; Codehighlighter1_6_454_Closed_Image.style.display='inline'; Codehighlighter1_6_454_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_6_454_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_6_454_Closed_Text.style.display='none'; Codehighlighter1_6_454_Open_Image.style.display='inline'; Codehighlighter1_6_454_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>    </span><span id=Codehighlighter1_6_454_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_6_454_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        moeutil::simple_pool spool(</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> p1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> spool.malloc(</span><span style="COLOR: #000000">15</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> p2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> spool.malloc(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> p3 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> spool.malloc(</span><span style="COLOR: #000000">15</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> p4 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> spool.malloc(</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> p5 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> spool.malloc(</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> p6 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> spool.malloc(</span><span style="COLOR: #000000">70</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">std::cout<<p1<<'\n'<<p2<<'\n'<<p3<<'\n'<<p4<<'\n'<<p5<<'\n'<<p6<<std::endl;</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">        spool.free(p1);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        spool.free(reinterpret_cast</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*></span><span style="COLOR: #000000">(p2)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        spool.free(p3);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        spool.free(p4);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        spool.free(p5);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        spool.free(p6);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_484_521_Open_Image onclick="this.style.display='none'; Codehighlighter1_484_521_Open_Text.style.display='none'; Codehighlighter1_484_521_Closed_Image.style.display='inline'; Codehighlighter1_484_521_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_484_521_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_484_521_Closed_Text.style.display='none'; Codehighlighter1_484_521_Open_Image.style.display='inline'; Codehighlighter1_484_521_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>    }</span></span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (moeutil::Exception</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> e)</span><span id=Codehighlighter1_484_521_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_484_521_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        std::cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">e.what()</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">std::endl;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>    }</span></span></div> q是一个简易的内存池类Q其中simple_pool的析构函C抛出异常Q然后free函数也会抛出异常。析构函数可以检是否有内存泄漏Q而free函数是检到无效的传入指针时会抛出异常。析构抛出异常是没问题的Q但是free抛出异常的时候问题就来了Q当free抛出异常Ӟ׃会脱try块,所以spool也会被析构,q样׃陷入ȝQ由于没有全部freeQ所以析构本w也会抛出异常,D了类g异常q代的情c也是_在throw一个异常的q程中又一ơ触发了异常。于是windowspȝ的debug error对话框出CQ而且是出现在throw那一行?br>此随W用于提醒自己勿犯第二次Q? <img src ="http://www.shnenglu.com/shanoa/aggbug/91967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shanoa/" target="_blank">酿妹?/a> 2009-08-02 17:12 <a href="http://www.shnenglu.com/shanoa/archive/2009/08/02/91967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用boost库需要一定的素质http://www.shnenglu.com/shanoa/archive/2009/07/30/91733.html酿妹?/dc:creator>酿妹?/author>Thu, 30 Jul 2009 10:19:00 GMThttp://www.shnenglu.com/shanoa/archive/2009/07/30/91733.htmlhttp://www.shnenglu.com/shanoa/comments/91733.htmlhttp://www.shnenglu.com/shanoa/archive/2009/07/30/91733.html#Feedback22http://www.shnenglu.com/shanoa/comments/commentRss/91733.htmlhttp://www.shnenglu.com/shanoa/services/trackbacks/91733.html        可能׃在几个博客上发布了一些boost库用心得的关系Q最qL被一些相关的询问邮g骚扰Q而提问者问的问题却又让我不知道如何回答才好Q或者说Ҏ(gu)没有办法回答。一些问题根本就不该问的Q所以便发些感慨Q还望看了本Z些心得又不禁想问一些偷懒问题的各位手下留情Q不要再问我一些奇怪的问题?*w*)!
        我们学习q用boost库的目的是简化编E,qƈ不代表简化到你根本不需要去理解原理的地步。我惻I如果(zhn)希望很好的Nboost库的话,那么请对(zhn)自己发发狠努力~写代码U篏l验Q直到?zhn)认ؓboost库中30%的功能?zhn)都能够亲自动手实现的时候,才尝试去使用它。类?#8220;怎么让线E组和asio合作使用”之类的问题,我觉得很囧,而且问的非常多,l代码都q迷p。我觉得(zhn)想用asioQ请先尝试编写线E类和IOCP框架的应用程序,如果(zhn)连U程c都写不好,或者连一个多U程死锁和共享区都不能安全排除的话,请先打打基础吧?br>        boost库是一个非常有深度的东西,也是智慧的结Ӟ有很多东西在一定条件下(zhn)可以不用深IӞ但是L?0%则必d栚w底,q?0%实际上都是很基础的东西,切不可急于一时而至整个工程最l因为boost的一点小问题卡壳Q倘若无法NQ则不如不用Q再急我也没法帮(zhn)了Q?/p>

]]>
VC~译器中的一些编译时命o备忘http://www.shnenglu.com/shanoa/archive/2009/07/30/91730.html酿妹?/dc:creator>酿妹?/author>Thu, 30 Jul 2009 10:00:00 GMThttp://www.shnenglu.com/shanoa/archive/2009/07/30/91730.htmlhttp://www.shnenglu.com/shanoa/comments/91730.htmlhttp://www.shnenglu.com/shanoa/archive/2009/07/30/91730.html#Feedback0http://www.shnenglu.com/shanoa/comments/commentRss/91730.htmlhttp://www.shnenglu.com/shanoa/services/trackbacks/91730.html 

// 加蝲静态库
#pragma comment(lib, "路径+LIB库名")

// 止1221可?/span>
#pragma warning(disable: 1221)

// 导入q加载DLL exe之类的二q制动态库
#import "路径+二进制库?/span>"

// ClassNamecM的s_Data静态成员变量定义在头文件中旉止重定义
__declspec(selectany) int ClassName::s_Data = 0;

// 当用户用void func()函数Ӟ~译器将作出警告Qƈ昄“不推荐用该函数”字样
__declspec(deprecated("不推荐用该函数")) void func();


]]>
记录一下C++标准感(zhn)?/title><link>http://www.shnenglu.com/shanoa/archive/2009/07/29/91647.html</link><dc:creator>酿妹?/dc:creator><author>酿妹?/author><pubDate>Wed, 29 Jul 2009 15:46:00 GMT</pubDate><guid>http://www.shnenglu.com/shanoa/archive/2009/07/29/91647.html</guid><wfw:comment>http://www.shnenglu.com/shanoa/comments/91647.html</wfw:comment><comments>http://www.shnenglu.com/shanoa/archive/2009/07/29/91647.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/shanoa/comments/commentRss/91647.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shanoa/services/trackbacks/91647.html</trackback:ping><description><![CDATA[<p>        今天l于完成了自q日志库核心的几个cd法Q折腾了怹Q感觉安全性很好,一些多U程的死锁问题已l逐个排除了。由于需要跟C++标准库的输入输出共事,所以么ȝ自认为理解了C++标准的一些特性,C来以供备忘?br>        首先是文件流Q关于该的问题Q要扯就扯远了,主要说一说std::wofstream的问题。不要被q个w骗了Q其实它输出到文件上的依然还是那么回事,没有丝毫的变化。如果你是想输出Unicode到文本文件中Q那么你最好是用ios::binary模式Q然后一股脑的倒入文g中,如果要是使用<<重蝲W号的话Q输出到文g中的跟std::ofstream没区别,而且中文q无法输出。如果你遇见中文无法输出的问题,恩,可以调用std::wofstream::imbue()Ҏ(gu)Q具体也是一行:ofs.imbue(std::locale("chs"));搞定?br>我想QC++标准库ƈ不支持Unicode~码Q而是l字W地域化的编码方式,中文的可能也是GBK吧,听说C++0x标准会纳入Unicode~码支持Q如果是q样的话q心多了?br>        然后q有个不省心的地方就是流的streambuf中的~冲大小了,我发玎ͼfstream中的写缓冲居然一直是0啊,q个很头疼了,需要给文g指定缓冲的大小?/p> <img src ="http://www.shnenglu.com/shanoa/aggbug/91647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shanoa/" target="_blank">酿妹?/a> 2009-07-29 23:46 <a href="http://www.shnenglu.com/shanoa/archive/2009/07/29/91647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASIOȝQ!Q?/title><link>http://www.shnenglu.com/shanoa/archive/2009/06/26/88606.html</link><dc:creator>酿妹?/dc:creator><author>酿妹?/author><pubDate>Fri, 26 Jun 2009 14:14:00 GMT</pubDate><guid>http://www.shnenglu.com/shanoa/archive/2009/06/26/88606.html</guid><wfw:comment>http://www.shnenglu.com/shanoa/comments/88606.html</wfw:comment><comments>http://www.shnenglu.com/shanoa/archive/2009/06/26/88606.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.shnenglu.com/shanoa/comments/commentRss/88606.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shanoa/services/trackbacks/88606.html</trackback:ping><description><![CDATA[׃3天时_外加1天心情休_l于在第5天编写出了一个能q行的基于asio和thread_group的框Ӟ差点没气晕过去,把源码都看懂了才感觉会用了?br>试了一下,debug下一万次回应耗时800+毫秒Qrelease下是200+毫秒Q机器配|双?.5Gq,4个线Eƈ行工作,无错的感觉真好,再也不用担心iocpZ些奇怪的问题啦,因ؓ是巨Z写的实现Q呵c?br><br>q入正题Q简要说一下asio的实现原理吧。在win32q_上,asio是基于IOCP技术实现的Q我以前也用qIOCPQ却没想到居然能扩展成这P真是奇Q在其他q_下还会有别的Ҏ(gu)d玎ͼ具体见io_servicecM面这部分的源码:<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> The type of the platform-specific implementation.</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#if</span><span style="COLOR: #000000"> defined(BOOST_ASIO_HAS_IOCP)</span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>  typedef detail::win_iocp_io_service impl_type;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>  friend </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> detail::win_iocp_overlapped_ptr;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#elif</span><span style="COLOR: #000000"> defined(BOOST_ASIO_HAS_EPOLL)</span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>  typedef detail::task_io_service</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">detail::epoll_reactor</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> impl_type;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#elif</span><span style="COLOR: #000000"> defined(BOOST_ASIO_HAS_KQUEUE)</span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>  typedef detail::task_io_service</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">detail::kqueue_reactor</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> impl_type;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#elif</span><span style="COLOR: #000000"> defined(BOOST_ASIO_HAS_DEV_POLL)</span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>  typedef detail::task_io_service</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">detail::dev_poll_reactor</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> impl_type;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#else</span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>  typedef detail::task_io_service</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">detail::select_reactor</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> impl_type;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span></div> q部分代码其实就在boost::asio::io_servicecd明中的最前面几行Q可以看见在不同q_下,io_servicecȝ实现会不同。很昄Qwindowsq_下当然是win_iocp_io_servicecMؓ实现了(不过我一开始还以ؓwin_iocp_io_service是直接拿出来用的呢,q在疑惑q样怎么有移植性呢Q官Ҏ(gu)档也对该cd字不提,其实我卡壛_是卡在这里了Q差点就直接用这个类了^_^!Q?br><br>那么分析一下win_iocp_io_service的代码吧Q这里完全是用IOCP来\由各UQ务,大家使用post来委托Q务,内部调用的其实是IOCP的PostQueuedCompletionStatus函数Q然后线E们用run来接受Q务,内部其实是阻塞在IOCP的GetQueuedCompletionStatus函数上,一旦有了Q务就立即q回Q执行完后再一个@环,l箋d在这里等待下一个Q务的到来Q这U设计思想堪称奇Q对U程、服务以及Q务完全解耦,灉|度达C如此高度Q不愧ؓboost库的东西Q我只能有拜的䆾?..<br><br>说一下M的设计思想Q其实io_service像是劳工中介所Q而一个线E就是一个劳工,而调用post的模块相当于富h们,他们M介所委托dQ而劳工们听候中介所的调遣去执行q些dQQ务的内容写在富Zl你的handler上,也就是函数指针,指针指向具体实现是d的实质内宏V其实在整个q程中,富h们都不知道是哪个力_帮他们做的工作,只知道是中介所负责完成q些可以了。这使得逻辑上的耦合降到了最低。不q这L比喻也有个不恰当的地方,如果要q样比喻的话Q我只能_其实力_里面也有很多富h的^o^! 。很多劳工在完成d的过E中自己也托l中介所一些Q务,然后q些d很可能还是自己去完成。这也难怪,q行代码的Lq些U程Q那么调用post的肯定也会有q些U程了,不过不管怎么_如此循环往复可以解决问题就行,比喻不见得就得恰当,M事物之间都不可能完全相同Q只要能阐述思想p?br><br>最后还要说明的一点就是:委托的Q务其实可以设定执行的旉的,很不错的讑֮Q内部实现则是通过定时器原理,GetQueuedCompletionStatus有一个等待时间的参数g被用在这斚wQ还有源码中的定时器U程我ƈ没有q多的去理解QM大体原理已基本掌握,剩下的就是劲的用它了!Q!<br><br>另外Z方便Z,在这里插入一些代码可能更Ҏ(gu)让h理解吧,<br>下面q个是启动服务时的代码:<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> ServerFramework::run()<br><img id=Codehighlighter1_28_210_Open_Image onclick="this.style.display='none'; Codehighlighter1_28_210_Open_Text.style.display='none'; Codehighlighter1_28_210_Closed_Image.style.display='inline'; Codehighlighter1_28_210_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_28_210_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_28_210_Closed_Text.style.display='none'; Codehighlighter1_28_210_Open_Image.style.display='inline'; Codehighlighter1_28_210_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_28_210_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_28_210_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    boost::thread_group workers;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (uint32 i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> mWorkerCount; </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        workers.create_thread(<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>            boost::bind(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">boost::asio::io_service::run, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">mIoService));<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    workers.join_all();<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div> <br>在打开前就得分配好dQ否则线E们q行h退ZQ阻塞不住,d的分配就交给open函数了,它是分配了监听端口的dQ一旦有了连接就会抛Z个Q务,其中一个线E就会开始行动啦?br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_86_111_Open_Image onclick="this.style.display='none'; Codehighlighter1_86_111_Open_Text.style.display='none'; Codehighlighter1_86_111_Closed_Image.style.display='inline'; Codehighlighter1_86_111_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_86_111_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_86_111_Closed_Text.style.display='none'; Codehighlighter1_86_111_Open_Image.style.display='inline'; Codehighlighter1_86_111_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> ServerFramework::open(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> String</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> address, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> String</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> port, uint32 nWorkers </span><span id=Codehighlighter1_86_111_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_86_111_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">= DEFAULT_WORKER_COUNT</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_114_824_Open_Image onclick="this.style.display='none'; Codehighlighter1_114_824_Open_Text.style.display='none'; Codehighlighter1_114_824_Closed_Image.style.display='inline'; Codehighlighter1_114_824_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_114_824_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_114_824_Closed_Text.style.display='none'; Codehighlighter1_114_824_Open_Image.style.display='inline'; Codehighlighter1_114_824_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_114_824_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_114_824_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">    boost::asio::ip::tcp::resolver resolver(mIoService);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    boost::asio::ip::tcp::resolver::query query(address, port);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    boost::asio::ip::tcp::endpoint endpoint </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">resolver.resolve(query);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    mAcceptor.open(endpoint.protocol());<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    mAcceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">));<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    mAcceptor.bind(endpoint);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    mAcceptor.listen();<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    mNextConnection </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Connection(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    mAcceptor.async_accept(mNextConnection</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">getSocket(),<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        boost::bind(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">ServerFramework::__onConnect, </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">,<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        boost::asio::placeholders::error));<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    mWorkerCount </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> nWorkers;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (mWorkerCount </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> DEFAULT_WORKER_COUNT)<br><img id=Codehighlighter1_799_822_Open_Image onclick="this.style.display='none'; Codehighlighter1_799_822_Open_Text.style.display='none'; Codehighlighter1_799_822_Closed_Image.style.display='inline'; Codehighlighter1_799_822_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_799_822_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_799_822_Closed_Text.style.display='none'; Codehighlighter1_799_822_Open_Image.style.display='inline'; Codehighlighter1_799_822_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </span><span id=Codehighlighter1_799_822_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_799_822_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        mWorkerCount </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div> <br>open函数中给io_service的一个Q务就是在有链接访问服务器端口的情况下执行ServerFramework::__onConnect函数Q有一炚w要格外注意的Qio_service必须时刻都有d存在Q否则线Eio_service::run函数返回,于是U程都会l束q毁,E序退出,所以,你必M证无Z旉有Q务存在,q样U程们即使空闲了也还是会l箋{待Q不会销毁。所以,我在ServerFramework::__onConnect函数中又一ơ给了io_service相同的Q务,卻Il箋监听端口Q有链接了还是调用ServerFramework::__onConnect函数。如果你在ServerFramework::__onConnect执行完了q没有给io_serviced的话Q那么一切都晚了...... 代码如下Q?br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> ServerFramework::__onConnect(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> BoostSysErr</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> e)<br><img id=Codehighlighter1_56_394_Open_Image onclick="this.style.display='none'; Codehighlighter1_56_394_Open_Text.style.display='none'; Codehighlighter1_56_394_Closed_Image.style.display='inline'; Codehighlighter1_56_394_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_56_394_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_394_Closed_Text.style.display='none'; Codehighlighter1_56_394_Open_Image.style.display='inline'; Codehighlighter1_56_394_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_56_394_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_56_394_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (e)<br><img id=Codehighlighter1_67_113_Open_Image onclick="this.style.display='none'; Codehighlighter1_67_113_Open_Text.style.display='none'; Codehighlighter1_67_113_Closed_Image.style.display='inline'; Codehighlighter1_67_113_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_67_113_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_113_Closed_Text.style.display='none'; Codehighlighter1_67_113_Open_Image.style.display='inline'; Codehighlighter1_67_113_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </span><span id=Codehighlighter1_67_113_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_67_113_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        MOELOG_DETAIL_WARN(e.message().c_str());<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    Connection</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> p </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> mNextConnection;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    mNextConnection </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Connection(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 再次q入监听状?/span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">    mAcceptor.async_accept(mNextConnection</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">getSocket(),<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        boost::bind(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">ServerFramework::__onConnect, </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">,<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        boost::asio::placeholders::error));<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 处理当前链接</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">    __addConnection(p);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    p</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">start();<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div> <br>最后,展示一下这个类的所有成员变量吧Q?br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 用于U程池异步处理的核心对象</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    boost::asio::io_service mIoService;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> |络链接的接收器Q用于接收请求进入的链接</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    boost::asio::ip::tcp::acceptor mAcceptor;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 指向下一个将要被使用的链接对?/span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    Connection</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> mNextConnection;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 存储服务器链接对象的容器</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    ConnectionSet mConnections;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_225_265_Open_Image onclick="this.style.display='none'; Codehighlighter1_225_265_Open_Text.style.display='none'; Codehighlighter1_225_265_Closed_Image.style.display='inline'; Codehighlighter1_225_265_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_225_265_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_225_265_Closed_Text.style.display='none'; Codehighlighter1_225_265_Open_Image.style.display='inline'; Codehighlighter1_225_265_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>    </span><span id=Codehighlighter1_225_265_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_225_265_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">/ 为链接对象容器准备的strandQ防止ƈ行调用mConnections</span><span style="COLOR: #808080"></span></span><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">boost::asio::io_service::strand mStrand_mConnections;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 为链接对象容器准备的同步锁,防止q行调用mConnections</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    boost::mutex mMutex4ConnSet;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 为控制台输出准备的strandQ防止ƈ行调用std::cout</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    AsioService::strand mStrand_ConsoleIostream;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 工作U程的数?/span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    uint32 mWorkerCount;</span></div> <br><br><br>但愿q篇随笔也能Ҏ(gu)在研Iasio的朋友们有所帮助吧?br> <img src ="http://www.shnenglu.com/shanoa/aggbug/88606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shanoa/" target="_blank">酿妹?/a> 2009-06-26 22:14 <a href="http://www.shnenglu.com/shanoa/archive/2009/06/26/88606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost::bindl定成员函数ӞW一个参C递对象的Ҏ(gu)情况http://www.shnenglu.com/shanoa/archive/2009/06/15/87746.html酿妹?/dc:creator>酿妹?/author>Mon, 15 Jun 2009 14:34:00 GMThttp://www.shnenglu.com/shanoa/archive/2009/06/15/87746.htmlhttp://www.shnenglu.com/shanoa/comments/87746.htmlhttp://www.shnenglu.com/shanoa/archive/2009/06/15/87746.html#Feedback4http://www.shnenglu.com/shanoa/comments/commentRss/87746.htmlhttp://www.shnenglu.com/shanoa/services/trackbacks/87746.html

class A
{
public:
    
void func();
}
;


A a;
A
& r = a;

boost::bind(
&A::func, a);
boost::bind(
&a::func, &a);
boost::bind(
&a::func, r);

׃面的代码可以看出Q我们可以随便传L一U类对象的Ş式,函数模板会自动寻找最为匹配的为我们实现。但是有两种情况是特D的Q即Q?br>1、该对象不可q行拯构造函数?br>2、该对象不可随意被析构?br>发现q个问题是在我编写单件模式时的遇见的Q当时发现我的单件对象在bind中被析构了一ơ,q很不寻常,Z么bind会调用第一个参数的析构呢?跟踪q了boost的源码才发现Q原来所有的参数都会被拷贝一遍,然后析构一遍,q样一来,我们传递参数的时候就会有一些小ȝ了,首先必须保证参数能够被拷贝而不影响逻辑和数据一致性,其次Q参数能够被析构而不影响逻辑和数据一致性。单件是全局性质的数据,所以绝对不可以析构Q那么这U情늚话,我们只好传递单件对象的地址Q而不能传递值或引用?br>
另:附上出错问题的代码如?br>
class InputDevice
    : 
public EventSource
    , 
public Singleton<InputDevice>
{
public:
    
}
;

class TestUI
    : 
public Singleton<TestUI>
{
public:
    
~TestUI(){
        std::cout
<<"~TestUI"<<std::endl;
    }

    
void processKeyboard(EventArgs& args){
        std::cout
<<"键盘响应"<<std::endl;
    }


    
void processMouse(EventArgs& args){
        std::cout
<<"鼠标响应"<<std::endl;
    }

}
;


int _tmain(int argc, _TCHAR* argv[])
{
    
new FrameUpdaterManager;
    
new DelayEventSender;
    
new InputDevice;
    
new TestUI;

    InputDevice::getSingleton().mEventSet.addEvent(
"KeyDown", Event());
    InputDevice::getSingleton().mEventSet.addEvent(
"KeyUp", Event());
    InputDevice::getSingleton().mEventSet.addEvent(
"MouseLDown", Event());
    InputDevice::getSingleton().mEventSet.addEvent(
"MouseLUp", Event());
    InputDevice::getSingleton().mEventSet.addEvent(
"MouseRDown", Event());
    InputDevice::getSingleton().mEventSet.addEvent(
"MouseRUp", Event());


    
//TestUI& ui = TestUI::getSingleton(); // 用此行便会出?/span>
    TestUI* ui = TestUI::getSingletonPtr();

    
// 出错开?/span>
    InputDevice::getSingleton().mEventSet["KeyDown"+= boost::bind(&TestUI::processKeyboard, ui, _1);
    InputDevice::getSingleton().mEventSet[
"KeyUp"+= boost::bind(&TestUI::processKeyboard, ui, _1);

    InputDevice::getSingleton().mEventSet[
"MouseLDown"+= boost::bind(&TestUI::processMouse, ui, _1);
    InputDevice::getSingleton().mEventSet[
"MouseLUp"+= boost::bind(&TestUI::processMouse, ui, _1);
    InputDevice::getSingleton().mEventSet[
"MouseRDown"+= boost::bind(&TestUI::processMouse, ui, _1);
    InputDevice::getSingleton().mEventSet[
"MouseRUp"+= boost::bind(&TestUI::processMouse, ui, _1);


    delete TestUI::getSingletonPtr();
    delete InputDevice::getSingletonPtr();
    delete DelayEventSender::getSingletonPtr();
    delete FrameUpdaterManager::getSingletonPtr();
    
return 0;
}



]]>
log4cxx C++的日志库使用随记http://www.shnenglu.com/shanoa/archive/2009/06/10/87342.html酿妹?/dc:creator>酿妹?/author>Wed, 10 Jun 2009 09:03:00 GMThttp://www.shnenglu.com/shanoa/archive/2009/06/10/87342.htmlhttp://www.shnenglu.com/shanoa/comments/87342.htmlhttp://www.shnenglu.com/shanoa/archive/2009/06/10/87342.html#Feedback1http://www.shnenglu.com/shanoa/comments/commentRss/87342.htmlhttp://www.shnenglu.com/shanoa/services/trackbacks/87342.html说说具体用法Q首先当然是在你的C++代码中写上Log的各U东西了
#include <log4cxx/logger.h>
#include 
<log4cxx/logstring.h>
#include 
<log4cxx/propertyconfigurator.h>

int _tmain(int argc, _TCHAR* argv[])
{
    
using namespace log4cxx;

    
// d配置文g
    PropertyConfigurator::configure("log4cxx.cfg");

    
// 建立两个logger
    LoggerPtr logger1 = Logger::getLogger("TraceYourMama");
    LoggerPtr logger2 
= Logger::getLogger("Patch");

    LOG4CXX_TRACE(logger1, 
"跟踪");
    LOG4CXX_WARN(logger1, 
"警告");
    LOG4CXX_DEBUG(logger1, 
"调试");
    LOG4CXX_ASSERT(logger1, 
false"断言");
    LOG4CXX_FATAL(logger1, 
"致命");

    LOG4CXX_TRACE(logger2, 
"跟踪");
    LOG4CXX_ERROR(logger2, 
"错误");
    
return 0;
}


其实在实际应用中Q每个类都可以搞一个loggerQ然后在配置文g中进行如下的讄Q?br>
# 讄root logger为DEBUGU别
#log4j.rootLogger
=TRACE,ca
log4j.logger.TraceYourMama
=ERROR,fa,ha
log4j.logger.Patch
=Trace,ca

#讄spirit为TRACEU别
#log4j.spirit
=DEBUG
#log4j.additivity.spirit
=false


# %m - message
# %n - 回R
# %d - 旉
# %.16c - Logger名称
# %-5p - logU别
# %t - thread_id



#对Appender caq行讄Q?br>#q是一个控制台cd的Appender
#输出格式QlayoutQؓPatternLayout
log4j.appender.ca
=org.apache.log4j.ConsoleAppender
log4j.appender.ca.layout
=org.apache.log4j.PatternLayout
log4j.appender.ca.layout.ConversionPattern
=%d %-5p %.16c - %m%n





#对Appender faq行讄Q?br># q是一个文件类型的AppenderQ?br># 其输出文ӞFileQؓ./debug.logQ?br># 输出方式QAppendQؓ覆盖方式Q?br># 输出格式QlayoutQؓPatternLayout
log4j.appender.fa
=org.apache.log4j.FileAppender
log4j.appender.fa.File
=./debug.log
log4j.appender.fa.Append
=true
log4j.appender.fa.layout
=org.apache.log4j.PatternLayout
#log4j.appender.fa.layout.ConversionPattern
=%d [%t] %-5p %.16c %x - %m%n
log4j.appender.fa.layout.ConversionPattern
=%d %-5p %.16c - %m%n






]]>
boost statecharthttp://www.shnenglu.com/shanoa/archive/2009/05/30/86143.html酿妹?/dc:creator>酿妹?/author>Sat, 30 May 2009 00:34:00 GMThttp://www.shnenglu.com/shanoa/archive/2009/05/30/86143.htmlhttp://www.shnenglu.com/shanoa/comments/86143.htmlhttp://www.shnenglu.com/shanoa/archive/2009/05/30/86143.html#Feedback0http://www.shnenglu.com/shanoa/comments/commentRss/86143.htmlhttp://www.shnenglu.com/shanoa/services/trackbacks/86143.html接触了boost的状态机Q发C是想象中的那么好用,在一些地方还得用上mpl库里的东西,׃Ҏ(gu)板元~程不是很熟l,搞了好些天才弄明白q该ȝmpl::list的原理和用法?br>boost的状态机是属于静态链接的状态机Q也是_它的囄构是~译期间q定了的,在运行时不可以动态配|。所以,它的用途是有一定局限性的Q但在一般情况下Q它不仅很通用Q而且在你会用q熟l地情况下,q会很好用,用v来很舒服Q逻辑也很合理。下面就是一D代码,当然也是借鉴了别人的东西Q自׃改了一下,在MainState中添加了一个Transition做了试Q因为此前我q不知道一个状态如何包含多个TransitionQ呵呵,原来是用mpl::list来做。至于这个状态机的入门教E,|上随处可见的三部曲Q《boost 状态机入门教程》说得很清楚?br>

  1 #include <iostream>
  2 #include <ctime>
  3 
  4 #include <boost/statechart/transition.hpp>
  5 #include <boost/statechart/event.hpp>
  6 #include <boost/statechart/state_machine.hpp>
  7 #include <boost/statechart/simple_state.hpp>
  8 
  9 namespace sc = boost::statechart;
 10 
 11 
 12 
 13 class EvtStartStop : public sc::event<EvtStartStop>{};
 14 class EvtReset : public sc::event<EvtReset>{};
 15 class EvtGo : public sc::event<EvtGo>{};
 16 
 17 
 18 class MainState;
 19 class StopState;
 20 class RunState;
 21 class TwoState;
 22 
 23 class Machine : public sc::state_machine<Machine, MainState>
 24 {};
 25 
 26 
 27 
 28 
 29 
 30 
 31 class MainState : public sc::simple_state<MainState, Machine, StopState>
 32 {
 33 public:
 34     typedef sc::transition<EvtReset, MainState> reactReset;
 35     typedef sc::transition<EvtGo, TwoState> reactGo;
 36     typedef boost::mpl::list<reactReset, reactGo> reactions;
 37 
 38     MainState(void){
 39         std::cout<<"q入MainState"<<std::endl;
 40         mTime = 0;
 41     }
 42 
 43     ~MainState(void){
 44         std::cout<<"退出MainState"<<std::endl;
 45     }
 46 
 47     double mTime;
 48 };
 49 
 50 
 51 // 该状态属于无用状态,用于试mpl::list的多transition用法
 52 class TwoState : public sc::simple_state<TwoState, Machine>
 53 {
 54 public:
 55     typedef sc::transition<EvtGo, MainState> reactions;
 56 
 57     TwoState(void){
 58         std::cout<<"q入TwoState"<<std::endl;
 59     }
 60 
 61     ~TwoState(void){
 62         std::cout<<"退出TwoState"<<std::endl;
 63     }
 64 };
 65 
 66 
 67 class StopState : public sc::simple_state<StopState, MainState>
 68 {
 69 public:
 70     typedef sc::transition<EvtStartStop, RunState> reactions;
 71     StopState(void){
 72         std::cout<<"q入StopState"<<std::endl;
 73     }
 74 
 75     ~StopState(void){
 76         std::cout<<"退出StopState"<<std::endl;
 77     }
 78 };
 79 
 80 class RunState : public sc::simple_state<RunState, MainState>
 81 {
 82 public:
 83     typedef sc::transition<EvtStartStop, StopState> reactions;
 84     RunState(void){
 85         std::cout<<"q入RunState"<<std::endl;
 86         mStartTime = 0;
 87     }
 88 
 89     ~RunState(void){
 90         std::cout<<"退出RunState"<<std::endl;
 91         context<MainState>().mTime += std::difftime(std::time(0), mStartTime);
 92     }
 93 
 94     std::time_t mStartTime;
 95 };
 96 
 97 
 98 int _tmain(int argc, _TCHAR* argv[])
 99 {
100     Machine mc;
101     mc.initiate();
102 
103     mc.process_event(EvtStartStop());
104     mc.process_event(EvtStartStop());
105     mc.process_event(EvtReset());
106     mc.process_event(EvtGo());
107     mc.process_event(EvtGo());
108 
109     return 0;
110 }


]]>
模版特例?/title><link>http://www.shnenglu.com/shanoa/archive/2009/05/25/85683.html</link><dc:creator>酿妹?/dc:creator><author>酿妹?/author><pubDate>Mon, 25 May 2009 03:14:00 GMT</pubDate><guid>http://www.shnenglu.com/shanoa/archive/2009/05/25/85683.html</guid><wfw:comment>http://www.shnenglu.com/shanoa/comments/85683.html</wfw:comment><comments>http://www.shnenglu.com/shanoa/archive/2009/05/25/85683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shanoa/comments/commentRss/85683.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shanoa/services/trackbacks/85683.html</trackback:ping><description><![CDATA[<p>写模版多了的人,必然会遇到这样那L问题Q模版特例化是解决了一个经常碰见的问题Q如果我们需要根据某些特D的模版参数cd来重新实C下算法的话,该怎么办呢Q说的多了那也没什么用Q我们就写一个会做除法的cd。这个类在做整数除法的时候会同时求出余数Q而在其他类型时是不求的。代码如下:<br><br></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>template</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">typename Ty</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Division<br></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img id=Codehighlighter1_59_254_Open_Image onclick="this.style.display='none'; Codehighlighter1_59_254_Open_Text.style.display='none'; Codehighlighter1_59_254_Closed_Image.style.display='inline'; Codehighlighter1_59_254_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_59_254_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_59_254_Closed_Text.style.display='none'; Codehighlighter1_59_254_Open_Image.style.display='inline'; Codehighlighter1_59_254_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_59_254_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_59_254_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    Division(Ty dividend, Ty divisor)<br></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img id=Codehighlighter1_145_146_Open_Image onclick="this.style.display='none'; Codehighlighter1_145_146_Open_Text.style.display='none'; Codehighlighter1_145_146_Closed_Image.style.display='inline'; Codehighlighter1_145_146_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_145_146_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_145_146_Closed_Text.style.display='none'; Codehighlighter1_145_146_Open_Image.style.display='inline'; Codehighlighter1_145_146_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>        :mDividend(dividend), mDivisor(divisor)</span><span id=Codehighlighter1_145_146_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_145_146_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> show()<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id=Codehighlighter1_170_226_Open_Image onclick="this.style.display='none'; Codehighlighter1_170_226_Open_Text.style.display='none'; Codehighlighter1_170_226_Closed_Image.style.display='inline'; Codehighlighter1_170_226_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_170_226_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_170_226_Closed_Text.style.display='none'; Codehighlighter1_170_226_Open_Image.style.display='inline'; Codehighlighter1_170_226_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </span><span id=Codehighlighter1_170_226_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_170_226_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        std::cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">l果 = </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">mDividend</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">mDivisor</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">std::endl;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    Ty mDividend, mDivisor;<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>template</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>inline </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Division</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">::show()<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img id=Codehighlighter1_303_409_Open_Image onclick="this.style.display='none'; Codehighlighter1_303_409_Open_Text.style.display='none'; Codehighlighter1_303_409_Closed_Image.style.display='inline'; Codehighlighter1_303_409_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_303_409_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_303_409_Closed_Text.style.display='none'; Codehighlighter1_303_409_Open_Image.style.display='inline'; Codehighlighter1_303_409_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_303_409_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_303_409_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    std::cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">l果 = </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">mDividend</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">mDivisor</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">std::endl;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    std::cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">余数 = </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">mDividend</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">mDivisor</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">std::endl;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> _tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, _TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[])<br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img id=Codehighlighter1_452_548_Open_Image onclick="this.style.display='none'; Codehighlighter1_452_548_Open_Text.style.display='none'; Codehighlighter1_452_548_Closed_Image.style.display='inline'; Codehighlighter1_452_548_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_452_548_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_452_548_Closed_Text.style.display='none'; Codehighlighter1_452_548_Open_Image.style.display='inline'; Codehighlighter1_452_548_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_452_548_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_452_548_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    Division</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> a(</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    a.show();<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    Division</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> b(</span><span style="COLOR: #000000">20.0f</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">11.0f</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    b.show();<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div> <br>以上q种方式叫做局部特化,关于全部特化和局部特化、全特化和偏特化Q我认ؓ他们之间的关pd紧密Q界限也很模p,要分类的话Q以上面的DivisioncMؓ例,q下面的代码对全部特化和局部特化的区别吧:<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #008000">@remark<br></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #008000"> Division的全部特?br></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">template</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Division</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">{<br></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">    Division(Ty dividend, Ty divisor)<br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">        :mDividend(dividend), mDivisor(divisor){}<br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> show()<br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">    {<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">        std::cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">l果 = </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">mDividend</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">mDivisor</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">std::endl;<br></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">        std::cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">余数 = </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">mDividend</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">mDivisor</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">std::endl;<br></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000">    }<br></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">    Ty mDividend, mDivisor;<br></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br></span><span style="COLOR: #008080">22</span> <span style="COLOR: #008000">@remark<br></span><span style="COLOR: #008080">23</span> <span style="COLOR: #008000">Division的局部特?br></span><span style="COLOR: #008080">24</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000">template</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span> <span style="COLOR: #000000">inline </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Division</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">::show()<br></span><span style="COLOR: #008080">27</span> <span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">28</span> <span style="COLOR: #000000">    std::cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">l果 = </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">mDividend</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">mDivisor</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">std::endl;<br></span><span style="COLOR: #008080">29</span> <span style="COLOR: #000000">    std::cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">余数 = </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">mDividend</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">mDivisor</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">std::endl;<br></span><span style="COLOR: #008080">30</span> <span style="COLOR: #000000">}</span></div> 上面的代码只是说明了全部特化和局部特化,q没有说明什么事全特化和偏特化。其实,对于只有一个参数的模版cd来说Qƈ没有什么全特化和偏特化的区别,但如果是一个以上的模板参数Q那是由区别的了,如下Q?br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #008000">@remark<br></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #008000">原始模板c?br></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">typename Ty, typename TyEx</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ObjectData<br></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">{<br></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #008000">@remark<br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #008000">Object的全特化<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">template</span><span style="COLOR: #000000"><></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ObjectData</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">19</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br></span><span style="COLOR: #008080">22</span> <span style="COLOR: #008000">@remark<br></span><span style="COLOR: #008080">23</span> <span style="COLOR: #008000">Object的偏特化Q只特化W一个参?br></span><span style="COLOR: #008080">24</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000">template</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">typename TyEx</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ObjectData</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">, TyEx</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">27</span> <span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">28</span> <span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">29</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">};</span></div> <br>以上仅ؓ个h观点Q错误之处请指正?br> <img src ="http://www.shnenglu.com/shanoa/aggbug/85683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shanoa/" target="_blank">酿妹?/a> 2009-05-25 11:14 <a href="http://www.shnenglu.com/shanoa/archive/2009/05/25/85683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.schzjy.cn" target="_blank">ڵþ</a>| <a href="http://www.qsstudio.cn" target="_blank">þZYZԴվĶ</a>| <a href="http://www.ryzd.com.cn" target="_blank">ƷȾþþø</a>| <a href="http://www.jiedidianzubiao.cn" target="_blank">Ʒþۺ</a>| <a href="http://www.818wg.cn" target="_blank">þþƷѲ</a>| <a href="http://www.fqvb.cn" target="_blank">þù׽</a>| <a href="http://www.zusang.cn" target="_blank">þþƷһ</a>| <a href="http://www.ksszzyy.cn" target="_blank">þþƷƷ޾Ʒ</a>| <a href="http://www.alilinfen.cn" target="_blank">ŷþһ</a>| <a href="http://www.zhihuzhuanlan.com.cn" target="_blank">99þþƷѿһ </a>| <a href="http://www.ds361.cn" target="_blank">ĻۺϾþ2</a>| <a href="http://www.1rizu.cn" target="_blank">žžþþƷר</a>| <a href="http://www.aurp.cn" target="_blank">ھƷ˾þþӰԺ</a>| <a href="http://www.akeyu.cn" target="_blank">ۺϾþþþþùɫ</a>| <a href="http://www.033009.cn" target="_blank">þþþƷþþþɫӰ</a>| <a href="http://www.yt-tongyong.cn" target="_blank">þֻоƷ߹ۿ</a>| <a href="http://www.cnbjwm.com.cn" target="_blank">˾Ʒ׽þ69</a>| <a href="http://www.wd12cjf8.cn" target="_blank">þĻƷһ</a>| <a href="http://www.fcks.net.cn" target="_blank">þۺ㽶AV</a>| <a href="http://www.xslbjb.cn" target="_blank">ھƷþþþþþþõӰ </a>| <a href="http://www.sdquanguan.cn" target="_blank">þۺۺϾþúݺݺ97ɫ88 </a>| <a href="http://www.zhaiseng.cn" target="_blank">999þþƷ</a>| <a href="http://www.zzjinhua.cn" target="_blank">Ʒþþþþ99</a>| <a href="http://www.japjoy.cn" target="_blank">ľþþþר</a>| <a href="http://www.xn88.cn" target="_blank">þܳ</a>| <a href="http://www.baidudianying.cn" target="_blank">ƷɫۺϾþ</a>| <a href="http://www.talkvo.cn" target="_blank">˳վ999þþۺ </a>| <a href="http://www.22du.net.cn" target="_blank">Ʒgzþþ</a>| <a href="http://www.gm53.cn" target="_blank">þ޾Ʒ˳ۺ</a>| <a href="http://www.globalimports.cn" target="_blank">þ˳ƷCAOPOREN </a>| <a href="http://www.donghuitong.cn" target="_blank">ŷһþþƷ޾Ʒþþþ </a>| <a href="http://www.0513act.cn" target="_blank">þþþþ</a>| <a href="http://www.6kun.cn" target="_blank">ѾƷ99þùۺϾƷ</a>| <a href="http://www.vzrg.cn" target="_blank">˾þô߽</a>| <a href="http://www.maituogangwan.cn" target="_blank">ҹƷƬþ</a>| <a href="http://www.mofeigzs.cn" target="_blank">þþƷһ</a>| <a href="http://www.meedow.cn" target="_blank">ҹƷþþþ</a>| <a href="http://www.029canon.cn" target="_blank">þþþþžžƷӰԺ</a>| <a href="http://www.ha-jc.cn" target="_blank">ܻƺ۵վþmimiɫ</a>| <a href="http://www.smmz.com.cn" target="_blank">þùƷƬ</a>| <a href="http://www.uubux.com.cn" target="_blank">͵͵þþþվ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>