﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-我喜欢生命本身的挑战！</title><link>http://www.cppblog.com/Alina-zl/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 22:58:39 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 22:58:39 GMT</pubDate><ttl>60</ttl><item><title>用VC调整显示器的分辨率 zz</title><link>http://www.cppblog.com/Alina-zl/archive/2009/03/24/77702.html</link><dc:creator>Alina-zl</dc:creator><author>Alina-zl</author><pubDate>Tue, 24 Mar 2009 03:19:00 GMT</pubDate><guid>http://www.cppblog.com/Alina-zl/archive/2009/03/24/77702.html</guid><wfw:comment>http://www.cppblog.com/Alina-zl/comments/77702.html</wfw:comment><comments>http://www.cppblog.com/Alina-zl/archive/2009/03/24/77702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alina-zl/comments/commentRss/77702.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alina-zl/services/trackbacks/77702.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p><font style="BACKGROUND-COLOR: #ffffff">调整分辨率的代码如下：<br>DEVMODE dm;<br>&nbsp;dm.dmSize = sizeof(DEVMODE) ;<br>&nbsp;EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&amp;dm);<br>&nbsp;if(dm.dmPelsHeight!=1024||dm.dmPelsWidth!=1280){<br>&nbsp; if(AfxMessageBox("为了达到最好的显示效果，建议您使用1280*1024的分辨率，确定吗？",MB_YESNO)==IDYES){<br>&nbsp;&nbsp; LONG result;<br>&nbsp;&nbsp; dm.dmBitsPerPel = 32;<br>&nbsp;&nbsp; dm.dmPelsHeight = 1024;<br>&nbsp;&nbsp; dm.dmPelsWidth = 1280;<br>&nbsp;&nbsp; dm.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;<br>&nbsp;&nbsp; result = ChangeDisplaySettings(&amp;dm,0);<br>&nbsp; }<br>&nbsp;}<br>&#8220;如果要在程序启动时自动自动调整到合适的分辨率，可以将其加入到View的OnInitialUpdate()中，并记录下dm.dmPelsHeight和dm.dmPelsWidth的值。<br>要在程序结束时自动调整回原有分辨率，可在MainFrame的OnClose()中用以上代码将其改回原值。&#8221;</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff">如果要在程序启动时自动自动调整到合适的分辨率，可以将其加入到app的InitInstance()中，并记录下dm.dmPelsHeight和dm.dmPelsWidth的值。<br>要在程序结束时自动调整回原有分辨率，可在APP的ExitInstance中用以上代码将其改回原值。&#8221;<br></font></p>
<img src ="http://www.cppblog.com/Alina-zl/aggbug/77702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alina-zl/" target="_blank">Alina-zl</a> 2009-03-24 11:19 <a href="http://www.cppblog.com/Alina-zl/archive/2009/03/24/77702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc2005中没有classwizard这个命令了 2005下怎么添加鼠标事件</title><link>http://www.cppblog.com/Alina-zl/archive/2008/12/30/70757.html</link><dc:creator>Alina-zl</dc:creator><author>Alina-zl</author><pubDate>Tue, 30 Dec 2008 03:51:00 GMT</pubDate><guid>http://www.cppblog.com/Alina-zl/archive/2008/12/30/70757.html</guid><wfw:comment>http://www.cppblog.com/Alina-zl/comments/70757.html</wfw:comment><comments>http://www.cppblog.com/Alina-zl/archive/2008/12/30/70757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alina-zl/comments/commentRss/70757.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alina-zl/services/trackbacks/70757.html</trackback:ping><description><![CDATA[vc2005中没有classwizard这个命令了 <br><br>取代classwizard 中的添加消息映射，添加类，等等的功能主要在属性窗口中 <br><br><span style="COLOR: red">鼠标事件不要手动添加，最好使用下述方法</span><br><br>比如添加消息映射。你选定了一个类后，在属性点击右键 选择属性 <br>在属性窗口中点击那个像闪电样的 图标 就会出现 一系列的消息供你选择 ，点击 小方快样子的图标 就会出现虚函数或者重载 <br><br>至于添加类，直接在工程名称上点右键 选择 添加类的命令 即可 <br><br>添加变量 ，可以在类名称上点右键，选择添加变量 
<img src ="http://www.cppblog.com/Alina-zl/aggbug/70757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alina-zl/" target="_blank">Alina-zl</a> 2008-12-30 11:51 <a href="http://www.cppblog.com/Alina-zl/archive/2008/12/30/70757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>'IDD_DIALOG1'   :   undeclared   identifier  </title><link>http://www.cppblog.com/Alina-zl/archive/2008/12/16/69594.html</link><dc:creator>Alina-zl</dc:creator><author>Alina-zl</author><pubDate>Tue, 16 Dec 2008 11:20:00 GMT</pubDate><guid>http://www.cppblog.com/Alina-zl/archive/2008/12/16/69594.html</guid><wfw:comment>http://www.cppblog.com/Alina-zl/comments/69594.html</wfw:comment><comments>http://www.cppblog.com/Alina-zl/archive/2008/12/16/69594.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Alina-zl/comments/commentRss/69594.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alina-zl/services/trackbacks/69594.html</trackback:ping><description><![CDATA[error&nbsp;<wbr>&nbsp;<wbr> C2065:&nbsp;<wbr>&nbsp;<wbr> 'IDD_DIALOG1'&nbsp;<wbr>&nbsp;<wbr> :&nbsp;<wbr>&nbsp;<wbr> undeclared&nbsp;<wbr>&nbsp;<wbr> identifier&nbsp;<wbr>&nbsp;<br>
<p>解决办法:</p>
<p>加#include&nbsp;<wbr>&nbsp;<wbr> 'resource.h'</p>
<img src ="http://www.cppblog.com/Alina-zl/aggbug/69594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alina-zl/" target="_blank">Alina-zl</a> 2008-12-16 19:20 <a href="http://www.cppblog.com/Alina-zl/archive/2008/12/16/69594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC与namespace的冲突问题</title><link>http://www.cppblog.com/Alina-zl/archive/2008/11/21/67468.html</link><dc:creator>Alina-zl</dc:creator><author>Alina-zl</author><pubDate>Fri, 21 Nov 2008 03:21:00 GMT</pubDate><guid>http://www.cppblog.com/Alina-zl/archive/2008/11/21/67468.html</guid><wfw:comment>http://www.cppblog.com/Alina-zl/comments/67468.html</wfw:comment><comments>http://www.cppblog.com/Alina-zl/archive/2008/11/21/67468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alina-zl/comments/commentRss/67468.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alina-zl/services/trackbacks/67468.html</trackback:ping><description><![CDATA[<p>把代码从QT移植到MFC的时候，这个文件vecmat.h，出现了如下错误：<br>error C2143: syntax error : missing ',' before ')'<br>error C2143: syntax error : missing ';' before '}'<br>error C2059: syntax error : ')'<br>fatal error C1004: unexpected end-of-file found<br>等等。<br><font style="BACKGROUND-COLOR: #cce8cf">vecmat.h源代码如下: </font></p>
<p>#ifndef&nbsp; VECMAT_H<br># define VECMAT_H</p>
<p># include &lt;cmath&gt;<br># include &lt;vector&gt;<br># include &lt;iostream&gt;</p>
<p>&nbsp;</p>
<p>namespace vecmat {</p>
<p>&nbsp;namespace internal {</p>
<p>&nbsp;&nbsp;template &lt;bool B&gt;<br>&nbsp;&nbsp;struct is_false {};</p>
<p>&nbsp;&nbsp;template &lt;&gt;<br>&nbsp;&nbsp;struct is_false&lt;false&gt; {<br>&nbsp;&nbsp;&nbsp;static inline void ensure() {}<br>&nbsp;&nbsp;};</p>
<p>&nbsp;} // end of namespace internal</p>
<p>&nbsp;//<br>&nbsp;//&nbsp; Vector class<br>&nbsp;//&nbsp;&nbsp;&nbsp; - T: value type<br>&nbsp;//&nbsp;&nbsp;&nbsp; - N: dimension<br>&nbsp;//<br>&nbsp;/////////////////////////////////////////////////////////////////////////////</p>
<p>&nbsp;template &lt;class T, unsigned N&gt;<br>&nbsp;class Vector<br>&nbsp;{<br>&nbsp;public:</p>
<p>&nbsp;&nbsp;typedef T value_type;</p>
<p>&nbsp;&nbsp;// constructors</p>
<p>&nbsp;&nbsp;inline Vector() {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;_coord[i] = 0;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;~Vector() {<br>&nbsp;&nbsp;&nbsp;internal::is_false&lt;(N == 0)&gt;::ensure();<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline Vector(const U tab[N]) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;_coord[i] = (T)tab[i];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline Vector(const std::vector&lt;U&gt;&amp; tab) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;_coord[i] = (T)tab[i];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline Vector(const Vector&lt;U, N&gt;&amp; v) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;_coord[i] = (T)v[i];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;// accessors</p>
<p>&nbsp;&nbsp;inline value_type&nbsp; operator[](const unsigned i) const {<br>&nbsp;&nbsp;&nbsp;return _coord[i];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type&amp; operator[](const unsigned i) {<br>&nbsp;&nbsp;&nbsp;return _coord[i];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;static inline unsigned dim() {<br>&nbsp;&nbsp;&nbsp;return N;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;// various useful methods</p>
<p>&nbsp;&nbsp;inline value_type norm() const {<br>&nbsp;&nbsp;&nbsp;return (T)sqrt(squareNorm());<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type squareNorm() const {<br>&nbsp;&nbsp;&nbsp;return (*this) * (*this);<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline Vector&lt;T, N&gt;&amp; normalize() {<br>&nbsp;&nbsp;&nbsp;value_type n = norm();<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;_coord[i] /= n;<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline Vector&lt;T, N&gt;&amp; normalizeSafe() {<br>&nbsp;&nbsp;&nbsp;value_type n = norm();<br>&nbsp;&nbsp;&nbsp;if (n)<br>&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned i=0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_coord[i] /= n;<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline Vector&lt;T, N&gt;&amp; min(const Vector&lt;T, N&gt;&amp; v) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i=0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;if (_coord[i]&nbsp; &gt; v._coord[i])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_coord[i] = v._coord[i];<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline Vector&lt;T, N&gt;&amp; max(const Vector&lt;T, N&gt;&amp; v) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i=0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;if (_coord[i]&nbsp; &lt; v._coord[i])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_coord[i] = v._coord[i];<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline const value_type* address() const {<br>&nbsp;&nbsp;&nbsp;return _coord;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;// classical operators</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline Vector&lt;T, N&gt;&amp; operator=(const Vector&lt;U, N&gt;&amp; v) {<br>&nbsp;&nbsp;&nbsp;if (this != &amp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_coord[i] = (T)v[i];<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline Vector&lt;T, N&gt;&amp; operator+=(const Vector&lt;U, N&gt;&amp; v) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0 ; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;_coord[i] += (T)v[i];<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline Vector&lt;T, N&gt;&amp; operator-=(const Vector&lt;U, N&gt;&amp; v) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0 ; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;_coord[i] -= (T)v[i];<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline Vector&lt;T, N&gt;&amp; operator*=(const U r) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0 ; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;_coord[i] *= r;<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline Vector&lt;T, N&gt;&amp; operator/=(const U r) {<br>&nbsp;&nbsp;&nbsp;if (r)<br>&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned i = 0 ; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_coord[i] /= r;<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p><br>&nbsp;&nbsp;inline bool operator==(const Vector&lt;T, N&gt;&amp; v) const {<br>&nbsp;&nbsp;&nbsp;for(unsigned i = 0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;if (_coord[i] != v[i])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;&nbsp;return true;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline bool operator!=(const Vector&lt;T, N&gt;&amp; v) const {<br>&nbsp;&nbsp;&nbsp;for(unsigned i = 0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;if (_coord[i] != v[i])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br>&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline bool operator&lt;(const Vector&lt;T, N&gt;&amp; v) const {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i&lt;N; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;if (_coord[i] &lt; v[i])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br>&nbsp;&nbsp;&nbsp;&nbsp;if (_coord[i] &gt; v[i])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;&nbsp;&nbsp;if (_coord[i] == v[i])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;return false;&nbsp; <br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline bool operator&gt;(const Vector&lt;T, N&gt;&amp; v) const {<br>&nbsp;&nbsp;&nbsp;for (unsigned i=0; i&lt;N; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;if(_coord[i] &gt; v[i])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br>&nbsp;&nbsp;&nbsp;&nbsp;if(_coord[i] &lt; v[i])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;&nbsp;&nbsp;if(_coord[i] == v[i])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;return false;&nbsp; <br>&nbsp;&nbsp;}</p>
<p>&nbsp;protected:</p>
<p>&nbsp;&nbsp;value_type _coord[N];<br>&nbsp;&nbsp;enum {<br>&nbsp;&nbsp;&nbsp;_dim = N,<br>&nbsp;&nbsp;};<br>&nbsp;};</p>
<p><br>&nbsp;//<br>&nbsp;//&nbsp; Vec2 class (2D Vector)<br>&nbsp;//&nbsp;&nbsp;&nbsp; - T: value type<br>&nbsp;//<br>&nbsp;/////////////////////////////////////////////////////////////////////////////</p>
<p>&nbsp;template &lt;class T&gt;<br>&nbsp;class Vec2 : public Vector&lt;T, 2&gt;<br>&nbsp;{<br>&nbsp;public:</p>
<p>&nbsp;&nbsp;typedef typename Vector&lt;T, 2&gt;::value_type value_type;</p>
<p>&nbsp;&nbsp;inline Vec2() : Vector&lt;T, 2&gt;() {}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline Vec2(const U tab[2]) : Vector&lt;T, 2&gt;(tab) {}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline Vec2(const std::vector&lt;U&gt;&amp; tab) : Vector&lt;T, 2&gt;(tab) {}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline Vec2(const Vector&lt;U, 2&gt;&amp; v) : Vector&lt;T, 2&gt;(v) {}</p>
<p>&nbsp;&nbsp;inline Vec2(const value_type x,<br>&nbsp;&nbsp;&nbsp;const value_type y = 0) : Vector&lt;T, 2&gt;() {<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[0] = (T)x;<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[1] = (T)y;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type x() const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[0];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type&amp; x() {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[0];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type y() const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[1];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type&amp; y() {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[1];<br>&nbsp;&nbsp;}<br>&nbsp;};</p>
<p><br>&nbsp;//<br>&nbsp;//&nbsp; HVec3 class (3D Vector in homogeneous coordinates)<br>&nbsp;//&nbsp;&nbsp;&nbsp; - T: value type<br>&nbsp;//<br>&nbsp;/////////////////////////////////////////////////////////////////////////////</p>
<p>&nbsp;template &lt;class T&gt;<br>&nbsp;class HVec3 : public Vector&lt;T, 4&gt;<br>&nbsp;{<br>&nbsp;public:</p>
<p>&nbsp;&nbsp;typedef typename Vector&lt;T, 4&gt;::value_type value_type;</p>
<p>&nbsp;&nbsp;inline HVec3() : Vector&lt;T, 4&gt;() {}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline HVec3(const U tab[4]) : Vector&lt;T, 4&gt;(tab) {}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline HVec3(const std::vector&lt;U&gt;&amp; tab) : Vector&lt;T, 4&gt;(tab) {}</p>
<p>&nbsp;&nbsp;template&lt;class U&gt;<br>&nbsp;&nbsp;inline HVec3(const Vector&lt;U, 4&gt;&amp; v) : Vector&lt;T, 4&gt;(v) {}</p>
<p>&nbsp;&nbsp;inline HVec3(const value_type sx,<br>&nbsp;&nbsp;&nbsp;const value_type sy = 0,<br>&nbsp;&nbsp;&nbsp;const value_type sz = 0,<br>&nbsp;&nbsp;&nbsp;const value_type s = 1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[0] = sx;<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[1] = sy;<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[2] = sz;<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[3] = s;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline HVec3(const Vector&lt;U, 3&gt;&amp; sv) {<br>&nbsp;&nbsp;&nbsp;this-&gt;_coord[0] = (T)sv[0];<br>&nbsp;&nbsp;&nbsp;this-&gt;_coord[1] = (T)sv[1];<br>&nbsp;&nbsp;&nbsp;this-&gt;_coord[2] = (T)sv[2];<br>&nbsp;&nbsp;&nbsp;this-&gt;_coord[3] = (T)1;<br>&nbsp;&nbsp;}</p>
<p><br>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline HVec3(const Vector&lt;U, 3&gt;&amp; sv,<br>&nbsp;&nbsp;&nbsp;const U) {<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[0] = (T)sv[0];<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[1] = (T)sv[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[2] = (T)sv[2];<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[3] = (T)s;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type sx() const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[0];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type&amp; sx() {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[0];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type sy() const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[1];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type&amp; sy() {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[1];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type sz() const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[2];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type&amp; sz() {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[2];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type s() const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[3];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type&amp; s() {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[3];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;// Acces to non-homogeneous coordinates in 3D</p>
<p>&nbsp;&nbsp;inline value_type x() const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[0] / this-&gt;_coord[3];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type y() const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[1] / this-&gt;_coord[3];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type z() const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[2] / this-&gt;_coord[3];<br>&nbsp;&nbsp;}<br>&nbsp;};</p>
<p><br>&nbsp;//<br>&nbsp;//&nbsp; Vec3 class (3D Vector)<br>&nbsp;//&nbsp;&nbsp;&nbsp; - T: value type<br>&nbsp;//<br>&nbsp;/////////////////////////////////////////////////////////////////////////////</p>
<p>&nbsp;template &lt;class T&gt;<br>&nbsp;class Vec3 : public Vector&lt;T, 3&gt;<br>&nbsp;{<br>&nbsp;public:</p>
<p>&nbsp;&nbsp;typedef typename Vector&lt;T, 3&gt;::value_type value_type;</p>
<p>&nbsp;&nbsp;inline Vec3() : Vector&lt;T, 3&gt;() {}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline Vec3(const U tab[3]) : Vector&lt;T, 3&gt;(tab) {}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline Vec3(const std::vector&lt;U&gt;&amp; tab) : Vector&lt;T, 3&gt;(tab) {}</p>
<p>&nbsp;&nbsp;template&lt;class U&gt;<br>&nbsp;&nbsp;inline Vec3(const Vector&lt;U, 3&gt;&amp; v) : Vector&lt;T, 3&gt;(v) {}</p>
<p>&nbsp;&nbsp;template&lt;class U&gt;<br>&nbsp;&nbsp;inline Vec3(const HVec3&lt;U&gt;&amp; v) {<br>&nbsp;&nbsp;&nbsp;this-&gt;_coord[0] = (T)v.x();<br>&nbsp;&nbsp;&nbsp;this-&gt;_coord[1] = (T)v.y();<br>&nbsp;&nbsp;&nbsp;this-&gt;_coord[2] = (T)v.z();<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline Vec3(const value_type x,<br>&nbsp;&nbsp;&nbsp;const value_type y = 0,<br>&nbsp;&nbsp;&nbsp;const value_type z = 0) : Vector&lt;T, 3&gt;() {<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[0] = x;<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[1] = y;<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[2] = z;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type x() const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[0];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type&amp; x() {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[0];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type y() const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[1];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type&amp; y() {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[1];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type z() const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[2];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type&amp; z() {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[2];<br>&nbsp;&nbsp;}<br>&nbsp;};</p>
<p><br>&nbsp;//<br>&nbsp;//&nbsp; Matrix class<br>&nbsp;//&nbsp;&nbsp;&nbsp; - T: value type<br>&nbsp;//&nbsp;&nbsp;&nbsp; - M: rows<br>&nbsp;//&nbsp;&nbsp;&nbsp; - N: cols<br>&nbsp;//<br>&nbsp;/////////////////////////////////////////////////////////////////////////////</p>
<p>&nbsp;// Dirty, but icc under Windows needs this<br># define _SIZE (M * N)</p>
<p>&nbsp;template &lt;class T, unsigned M, unsigned N&gt;<br>&nbsp;class Matrix<br>&nbsp;{<br>&nbsp;public:</p>
<p>&nbsp;&nbsp;typedef T value_type;</p>
<p>&nbsp;&nbsp;inline Matrix() {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; _SIZE; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[i] = 0;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;~Matrix() {<br>&nbsp;&nbsp;&nbsp;internal::is_false&lt;(M == 0)&gt;::ensure();<br>&nbsp;&nbsp;&nbsp;internal::is_false&lt;(N == 0)&gt;::ensure();<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline Matrix(const U tab[M][N]) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; M; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned j = 0; j &lt; N; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[i * N + j] = tab[i][j];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline Matrix(const U tab[_SIZE]) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; _SIZE; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[i] = tab[i];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline Matrix(const std::vector&lt;U&gt;&amp; tab) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; _SIZE; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[i] = tab[i];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline Matrix(const Matrix&lt;U, M, N&gt;&amp; m) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; M; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned j = 0; j &lt; N; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[i * N + j] = (T)m(i, j);<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type operator()(const unsigned i, const unsigned j) const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[i * N + j];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline value_type&amp; operator()(const unsigned i, const unsigned j) {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord[i * N + j];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;static inline unsigned rows() {<br>&nbsp;&nbsp;&nbsp;return M;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;static inline unsigned cols() {<br>&nbsp;&nbsp;&nbsp;return N;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline Matrix&lt;T, M, N&gt; transpose() const {<br>&nbsp;&nbsp;&nbsp;Matrix&lt;T, N, M&gt; res;<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; M; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned j = 0; j &lt; N; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res(j,i) = this-&gt;_coord[i * N + j];<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline void getArray(value_type res[M][N]) const {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; M; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned j = 0; j &lt; N; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res[i][j] = this-&gt;_coord[i * N + j];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline void getArray(value_type res[_SIZE]) const {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; _SIZE; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;res[i] = this-&gt;_coord[i];<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;inline const value_type* address() const {<br>&nbsp;&nbsp;&nbsp;return this-&gt;_coord;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline Matrix&lt;T, M, N&gt;&amp; operator=(const Matrix&lt;U, M, N&gt;&amp; m) {<br>&nbsp;&nbsp;&nbsp;if (this != &amp;m)<br>&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; M; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned j = 0; j &lt; N; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[i * N + j] = (T)m(i, j);<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline Matrix&lt;T, M, N&gt;&amp; operator+=(const Matrix&lt;U, M, N&gt;&amp; m) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; M; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned j = 0; j &lt; N; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[i * N + j] += (T)m(i, j);<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline Matrix&lt;T, M, N&gt;&amp; operator-=(const Matrix&lt;U, M, N&gt;&amp; m) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; M; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned j = 0; j &lt; N; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[i * N + j] -= (T)m(i, j);<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline Matrix&lt;T, M, N&gt;&amp; operator*=(const U lambda) {<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; M; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned j = 0; j &lt; N; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[i * N + j] *= lambda;<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline Matrix&lt;T, M, N&gt;&amp; operator/=(const U lambda) {<br>&nbsp;&nbsp;&nbsp;if (lambda)<br>&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; M; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned j = 0; j &lt; N; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;_coord[i * N + j] /= lambda;<br>&nbsp;&nbsp;&nbsp;return *this;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;protected:</p>
<p>&nbsp;&nbsp;value_type _coord[_SIZE];<br>&nbsp;};</p>
<p><br>&nbsp;//<br>&nbsp;//&nbsp; SquareMatrix class<br>&nbsp;//&nbsp;&nbsp;&nbsp; - T: value type<br>&nbsp;//&nbsp;&nbsp;&nbsp; - N: rows &amp; cols<br>&nbsp;//<br>&nbsp;/////////////////////////////////////////////////////////////////////////////</p>
<p>&nbsp;// Dirty, but icc under Windows needs this<br># define __SIZE (N * N)</p>
<p>&nbsp;template &lt;class T, unsigned N&gt;<br>&nbsp;class SquareMatrix : public Matrix&lt;T, N, N&gt;<br>&nbsp;{<br>&nbsp;public:</p>
<p>&nbsp;&nbsp;typedef T value_type;</p>
<p>&nbsp;&nbsp;inline SquareMatrix() : Matrix&lt;T, N, N&gt;() {}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline SquareMatrix(const U tab[__SIZE]) : Matrix&lt;T, N, N&gt;(tab) {}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;explicit inline SquareMatrix(const std::vector&lt;U&gt;&amp; tab) : Matrix&lt;T, N, N&gt;(tab) {}</p>
<p>&nbsp;&nbsp;template &lt;class U&gt;<br>&nbsp;&nbsp;inline SquareMatrix(const Matrix&lt;U, N, N&gt;&amp; m) : Matrix&lt;T, N, N&gt;(m) {}</p>
<p>&nbsp;&nbsp;static inline SquareMatrix&lt;T, N&gt; identity() {<br>&nbsp;&nbsp;&nbsp;SquareMatrix&lt;T, N&gt; res;<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;res(i, i) = 1;<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;&nbsp;}<br>&nbsp;};</p>
<p><br>&nbsp;//<br>&nbsp;// Vector external functions<br>&nbsp;//<br>&nbsp;/////////////////////////////////////////////////////////////////////////////</p>
<p>&nbsp;template &lt;class T, unsigned N&gt;<br>&nbsp;inline Vector&lt;T, N&gt; operator+(const Vector&lt;T, N&gt;&amp; v1,<br>&nbsp;&nbsp;const Vector&lt;T, N&gt;&amp; v2) {<br>&nbsp;&nbsp;&nbsp;Vector&lt;T, N&gt; res(v1);<br>&nbsp;&nbsp;&nbsp;res += v2;<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;}</p>
<p>&nbsp;template &lt;class T, unsigned N&gt;<br>&nbsp;inline Vector&lt;T, N&gt; operator-(const Vector&lt;T, N&gt;&amp; v1,<br>&nbsp;&nbsp;const Vector&lt;T, N&gt;&amp; v2) {<br>&nbsp;&nbsp;&nbsp;Vector&lt;T, N&gt; res(v1);<br>&nbsp;&nbsp;&nbsp;res -= v2;<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;}<br>&nbsp;template &lt;class T, unsigned N&gt;<br>&nbsp;inline Vector&lt;T, N&gt; operator*(const Vector&lt;T, N&gt;&amp; v,<br>&nbsp;&nbsp;const typename Vector&lt;T, N&gt;::value_type r) {<br>&nbsp;&nbsp;&nbsp;Vector&lt;T, N&gt; res(v);<br>&nbsp;&nbsp;&nbsp;res *= r;<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;}</p>
<p>&nbsp;template &lt;class T, unsigned N&gt;<br>&nbsp;inline Vector&lt;T, N&gt; operator*(const typename Vector&lt;T, N&gt;::value_type r,<br>&nbsp;&nbsp;const Vector&lt;T, N&gt;&amp; v) {<br>&nbsp;&nbsp;&nbsp;Vector&lt;T, N&gt; res(v);<br>&nbsp;&nbsp;&nbsp;res *= r;<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;}</p>
<p>&nbsp;template &lt;class T, unsigned N&gt;<br>&nbsp;inline Vector&lt;T, N&gt; operator/(const Vector&lt;T, N&gt;&amp; v,<br>&nbsp;&nbsp;const typename Vector&lt;T, N&gt;::value_type r) {<br>&nbsp;&nbsp;&nbsp;Vector&lt;T, N&gt; res(v);<br>&nbsp;&nbsp;&nbsp;if (r)<br>&nbsp;&nbsp;&nbsp;&nbsp;res /= r;<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;}</p>
<p>&nbsp;// dot product<br>&nbsp;template &lt;class T, unsigned N&gt;<br>&nbsp;inline typename Vector&lt;T, N&gt;::value_type operator*(const Vector&lt;T, N&gt;&amp; v1,<br>&nbsp;&nbsp;const Vector&lt;T, N&gt;&amp; v2) {<br>&nbsp;&nbsp;&nbsp;typename Vector&lt;T, N&gt;::value_type sum = 0;<br>&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;sum += v1[i] * v2[i];<br>&nbsp;&nbsp;&nbsp;return sum;<br>&nbsp;}</p>
<p>&nbsp;// cross product for 3D Vectors<br>&nbsp;template &lt;typename T&gt;<br>&nbsp;inline Vec3&lt;T&gt; operator^(const Vector&lt;T, 3&gt;&amp; v1,<br>&nbsp;&nbsp;const Vector&lt;T, 3&gt;&amp; v2) {<br>&nbsp;&nbsp;&nbsp;Vec3&lt;T&gt; res(v1[1] * v2[2] - v1[2] * v2[1],<br>&nbsp;&nbsp;&nbsp;&nbsp;v1[2] * v2[0] - v1[0] * v2[2],<br>&nbsp;&nbsp;&nbsp;&nbsp;v1[0] * v2[1] - v1[1] * v2[0]);<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;}</p>
<p>&nbsp;// stream operator<br>&nbsp;template &lt;class T, unsigned N&gt;<br>&nbsp;inline std::ostream&amp; operator&lt;&lt;(std::ostream&amp; s,<br>&nbsp;&nbsp;const Vector&lt;T, N&gt;&amp; v) {<br>&nbsp;&nbsp;&nbsp;unsigned i;<br>&nbsp;&nbsp;&nbsp;s &lt;&lt; "[";<br>&nbsp;&nbsp;&nbsp;for (i = 0; i &lt; N - 1; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;s &lt;&lt; v[i] &lt;&lt; ", ";<br>&nbsp;&nbsp;&nbsp;s &lt;&lt; v[i] &lt;&lt; "]";<br>&nbsp;&nbsp;&nbsp;return s;<br>&nbsp;}</p>
<p><br>&nbsp;//<br>&nbsp;// Matrix external functions<br>&nbsp;//<br>&nbsp;/////////////////////////////////////////////////////////////////////////////</p>
<p>&nbsp;template &lt;class T, unsigned M, unsigned N&gt;<br>&nbsp;inline Matrix&lt;T, M, N&gt;<br>&nbsp;&nbsp;operator+(const Matrix&lt;T, M, N&gt;&amp; m1,<br>&nbsp;&nbsp;const Matrix&lt;T, M, N&gt;&amp; m2) {<br>&nbsp;&nbsp;&nbsp;Matrix&lt;T, M, N&gt; res(m1);<br>&nbsp;&nbsp;&nbsp;res += m2;<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;}</p>
<p>&nbsp;template &lt;class T, unsigned M, unsigned N&gt;<br>&nbsp;inline Matrix&lt;T, M, N&gt;<br>&nbsp;&nbsp;operator-(const Matrix&lt;T, M, N&gt;&amp; m1,<br>&nbsp;&nbsp;const Matrix&lt;T, M, N&gt;&amp; m2) {<br>&nbsp;&nbsp;&nbsp;Matrix&lt;T, M, N&gt; res(m1);<br>&nbsp;&nbsp;&nbsp;res -= m2;<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;}</p>
<p>&nbsp;template &lt;class T, unsigned M, unsigned N&gt;<br>&nbsp;inline Matrix&lt;T, M, N&gt;<br>&nbsp;&nbsp;operator*(const Matrix&lt;T, M, N&gt;&amp; m1,<br>&nbsp;&nbsp;const typename Matrix&lt;T, M, N&gt;::value_type lambda) {<br>&nbsp;&nbsp;&nbsp;Matrix&lt;T, M, N&gt; res(m1);<br>&nbsp;&nbsp;&nbsp;res *= lambda;<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;}</p>
<p>&nbsp;template &lt;class T, unsigned M, unsigned N&gt;<br>&nbsp;inline Matrix&lt;T, M, N&gt;<br>&nbsp;&nbsp;operator*(const typename Matrix&lt;T, M, N&gt;::value_type lambda,<br>&nbsp;&nbsp;const Matrix&lt;T, M, N&gt;&amp; m1) {<br>&nbsp;&nbsp;&nbsp;Matrix&lt;T, M, N&gt; res(m1);<br>&nbsp;&nbsp;&nbsp;res *= lambda;<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;}</p>
<p>&nbsp;template &lt;class T, unsigned M, unsigned N&gt;<br>&nbsp;inline Matrix&lt;T, M, N&gt;<br>&nbsp;&nbsp;operator/(const Matrix&lt;T, M, N&gt;&amp; m1,<br>&nbsp;&nbsp;const typename Matrix&lt;T, M, N&gt;::value_type lambda) {<br>&nbsp;&nbsp;&nbsp;Matrix&lt;T, M, N&gt; res(m1);<br>&nbsp;&nbsp;&nbsp;res /= lambda;<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;}</p>
<p>&nbsp;template &lt;class T, unsigned M, unsigned N, unsigned P&gt;<br>&nbsp;inline Matrix&lt;T, M, P&gt;<br>&nbsp;&nbsp;operator*(const Matrix&lt;T, M, N&gt;&amp; m1,<br>&nbsp;&nbsp;const Matrix&lt;T, N, P&gt;&amp; m2) {<br>&nbsp;&nbsp;&nbsp;unsigned i, j, k;<br>&nbsp;&nbsp;&nbsp;Matrix&lt;T, M, P&gt; res;<br>&nbsp;&nbsp;&nbsp;typename&nbsp; Matrix&lt;T, N, P&gt;::value_type scale;</p>
<p>&nbsp;&nbsp;&nbsp;for (j = 0; j &lt; P; j++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;for (k = 0; k &lt; N; k++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scale = m2(k, j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i = 0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res(i, j) += m1(i, k) * scale;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;}</p>
<p>&nbsp;template &lt;class T, unsigned M, unsigned N&gt;<br>&nbsp;inline Vector&lt;T, M&gt;<br>&nbsp;&nbsp;operator*(const Matrix&lt;T, M, N&gt;&amp; m,<br>&nbsp;&nbsp;const Vector&lt;T, N&gt;&amp; v) {</p>
<p>&nbsp;&nbsp;&nbsp;Vector&lt;T, M&gt; res;<br>&nbsp;&nbsp;&nbsp;typename Matrix&lt;T, M, N&gt;::value_type scale;</p>
<p>&nbsp;&nbsp;&nbsp;for (unsigned j = 0; j &lt; M; j++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;scale = v[j];<br>&nbsp;&nbsp;&nbsp;&nbsp;for (unsigned i = 0; i &lt; N; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res[i] += m(i, j) * scale;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;return res;<br>&nbsp;}</p>
<p>&nbsp;// stream operator<br>&nbsp;template &lt;class T, unsigned M, unsigned N&gt;<br>&nbsp;inline std::ostream&amp; operator&lt;&lt;(std::ostream&amp; s,<br>&nbsp;&nbsp;const Matrix&lt;T, M, N&gt;&amp; m) {<br>&nbsp;&nbsp;&nbsp;unsigned i, j;<br>&nbsp;&nbsp;&nbsp;for (i = 0; i &lt; M; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;s &lt;&lt; "[";<br>&nbsp;&nbsp;&nbsp;&nbsp;for (j = 0; j &lt; N - 1; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s &lt;&lt; m(i, j) &lt;&lt; ", ";<br>&nbsp;&nbsp;&nbsp;&nbsp;s &lt;&lt; m(i, j) &lt;&lt; "]" &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;return s;<br>&nbsp;}</p>
<p>} // end of namespace vecmat</p>
<p>#endif // VECMAT_H<br><br><br><span style="COLOR: red">原因是在windows的头文件里max，min已经被定义成宏了，所以要出问题!<br>解决方法：<br>用<br>#ifdef max<br>#undef max<br>#endif<br>去掉max的定义。<br>min同上。</span></p>
<p style="COLOR: red">问题解决。</p>
<img src ="http://www.cppblog.com/Alina-zl/aggbug/67468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alina-zl/" target="_blank">Alina-zl</a> 2008-11-21 11:21 <a href="http://www.cppblog.com/Alina-zl/archive/2008/11/21/67468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CString, QString, char*之间的转换</title><link>http://www.cppblog.com/Alina-zl/archive/2008/11/19/67323.html</link><dc:creator>Alina-zl</dc:creator><author>Alina-zl</author><pubDate>Wed, 19 Nov 2008 13:39:00 GMT</pubDate><guid>http://www.cppblog.com/Alina-zl/archive/2008/11/19/67323.html</guid><wfw:comment>http://www.cppblog.com/Alina-zl/comments/67323.html</wfw:comment><comments>http://www.cppblog.com/Alina-zl/archive/2008/11/19/67323.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Alina-zl/comments/commentRss/67323.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alina-zl/services/trackbacks/67323.html</trackback:ping><description><![CDATA[<p><font style="BACKGROUND-COLOR: #ffffff" color=#0000ff>传给未分配内存的const char* （LPCTSTR）指针.<br>&nbsp;&nbsp; CString cstr(asdd);<br>&nbsp;&nbsp; const char* ch = (LPCTSTR)cstr;<br>&nbsp;&nbsp; ch指向的地址和cstr相同。但由于使用const保证ch不会修改，所以安全.2.传给未分配内存的指针.<br>&nbsp;&nbsp;&nbsp; CString cstr = "ASDDSD";<br>&nbsp;&nbsp;&nbsp; char *ch = cstr.GetBuffer(cstr1.GetLength() + 1);<br>&nbsp;&nbsp;&nbsp; cstr.ReleaseBuffer();<br>&nbsp;&nbsp;&nbsp; //修改ch指向的值等于修改cstr里面的值.<br>&nbsp;&nbsp;&nbsp; //PS:用完ch后,不用delete ch,因为这样会破坏cstr内部空间,容易造成程序崩溃.<br>3.第二种用法。把CString 值赋给已分配内存的char *。<br>&nbsp;&nbsp;&nbsp; CString cstr1 = "ASDDSD";<br>&nbsp;&nbsp;&nbsp; int strLength = cstr1.GetLength() + 1;<br>&nbsp;&nbsp;&nbsp; char *pValue = new char[strLength];<br>&nbsp;&nbsp;&nbsp; strncpy(pValue, cstr1, strLength);<br>4.第三种用法.把CString 值赋给已分配内存char[]数组.<br>&nbsp;&nbsp;&nbsp; CString cstr2 = "ASDDSD";<br>&nbsp;&nbsp;&nbsp; int strLength1 = cstr1.GetLength() + 1;<br>&nbsp;&nbsp;&nbsp; char chArray[100];<br>&nbsp;&nbsp;&nbsp; memset(chArray,0, sizeof(bool) * 100); //将数组的垃圾内容清空.<br>&nbsp;&nbsp;&nbsp; strncpy(chArray, cstr1, strLength1);</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" color=#0000ff>如果上述都不行：<br>CString转换为char*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString origCString("Hello, World!");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wchar_t* wCharString = origCString.GetBuffer(origCString.GetLength()+1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t origsize = wcslen(wCharString) + 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t convertedChars = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *CharString;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CharString=new char(origsize);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wcstombs_s(&amp;convertedChars, CharString, origsize, wCharString , _TRUNCATE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; CharString &lt;&lt; endl; <br>成功输出字符串"Hello,World" </font></p>
<p><font style="BACKGROUND-COLOR: #ffffff" color=#0000ff>原因：<br>原来在VC++ 2005以前，应用程序默认都是关闭对Unicode的支持的，而在VC2005中，默认打开了对它的支持，CString对应的字符串应该是TCHAR，TCHAR的定义是这样的，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #ifdef _UNICODE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef wchar_t TCHAR&nbsp;&nbsp;&nbsp; ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef char TCHAR;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endif <br>所以在工程中应该可以关闭对于Unicode的支持，从而可以直接转换。这个做法是右击工程名—〉Property—〉General中的character set中选择notset，这样，本文开头的那段代码就可以正确的执行了。</font></p>
<font style="BACKGROUND-COLOR: #ffffff" color=#0000ff>
<p><br>如何将QString转换为char *或者相反 </p>
<p>How can I convert a QString to char* and vice versa ?(trolltech)</p>
<p>Answer:<br>In order to convert a QString to a char*, then you first need to get a latin1 representation of the string by calling toLatin1() on it which will return a QByteArray. Then call data() on the QByteArray to get a pointer to the data stored in the byte array. See the documentation:</p>
<p>See the following example for a demonstration:</p>
<p>int main(int argc, char **argv)<br>{<br>&nbsp;QApplication app(argc, argv);<br>&nbsp;QString str1 = "Test";<br>&nbsp;QByteArray ba = str1.toLatin1();<br>&nbsp;const char *c_str2 = ba.data();<br>&nbsp;printf("str2: %s", c_str2);<br>&nbsp;return app.exec();&nbsp;&nbsp; <br>}<br>Note that it is necessary to store the bytearray before you call data() on it, a call like the following<br>const char *c_str2 = str2.toLatin1().data();</p>
<p>will make the application crash as the QByteArray has not been stored and hence no longer exists.</p>
<p><br>To convert a char* to a QString you can use the QString constructor that takes a QLatin1String, e.g:</p>
<p>QString string = QString(QLatin1String(c_str2)) ;</p>
<p>&nbsp;</p>
<p>还有其他多种方法：</p>
<p>方法一 -----------------------------------------<br>#define G2U(s) ( QTextCodec::codecForName("GBK")-&gt;toUnicode(s) )<br>#define U2G(s) ( QTextCodec::codecForName("GBK")-&gt;fromUnicode(s) )</p>
<p>QString str;<br>QCString cstr;</p>
<p>str = G2U("中文输入");<br>cstr = U2G(str);</p>
<p>QCString有这样一个重载运算符<br>operator const char * () const</p>
<p>可以这样<br>printf("%s\n", (const char*) cstr);<br>或是copy出来<br>char buf[1024];<br>strcpy(buf, (const char*) cstr);</p>
<p>&nbsp;</p>
<p>方法二 -----------------------------------------<br>如果是中文系统</p>
<p>直接用&nbsp;&nbsp; (const char*) str.local8Bit()<br>例如<br>printf("%s", (const char*) str.local8Bit());</p>
<p>str是一个QString</p>
<p>方法三 -----------------------------------------<br>char str[64];<br>QTextCodec *textcod = QTextCodec::codecForName("GBK");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QCString string1 = textcod -&gt;fromUnicode(listbox1-&gt;currentText());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(str,string1);</p>
<p>QString和Std::string</p>
<p>&nbsp;从char*到 QString可以从fromLocal8Bit()转化<br>std::string有c_str()的函数使再转化为char*</p>
<p>QString有toAscii()记不清了</p>
<p><br>你可以看看. </p>
<p><br>又是我的粗心酿成大错，我重新查看了一下Qt文档，原来Qt可以直接从std::wstring产生一个QString，用QString::fromStdWString(const std::wstring &amp;)这个静态成员函数即可。我试了试用std::string的c_str()返回的char *构造的QString不能再保存原先的中文信息，而用std::wstring构造的QString则可以用qDebug()输出原先的中文信息 <br>GB编码与UTF8编码的转换<br>在主函数app后加上这句：</p>
<p>QUOTE:</p>
<p>QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));</p>
<p>&nbsp;</p>
<p>然后是从UTF8编码到GB编码的字符串转换方法：</p>
<p>QUOTE:</p>
<p><br>QString Utf8_To_GB(QString strText)<br>{<br>&nbsp;&nbsp;&nbsp; return QString::fromUtf8(strText.toLocal8Bit().data());<br>}</p>
<p>&nbsp;</p>
<p>至于从GB到UTF8，那大家就经常用了：</p>
<p>QUOTE:</p>
<p>QString GB_To_Utf8(char *strText)<br>{<br>&nbsp;&nbsp;&nbsp; return QString::fromLocal8Bit(strText);<br>}</font><font color=#0000ff></font></p>
<img src ="http://www.cppblog.com/Alina-zl/aggbug/67323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alina-zl/" target="_blank">Alina-zl</a> 2008-11-19 21:39 <a href="http://www.cppblog.com/Alina-zl/archive/2008/11/19/67323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>