﻿<?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++博客-shangtang004</title><link>http://www.cppblog.com/shangtang004/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:10:05 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:10:05 GMT</pubDate><ttl>60</ttl><item><title>Handle assignment to self in operator=</title><link>http://www.cppblog.com/shangtang004/archive/2013/05/17/200357.html</link><dc:creator>魏尚堂</dc:creator><author>魏尚堂</author><pubDate>Fri, 17 May 2013 07:00:00 GMT</pubDate><guid>http://www.cppblog.com/shangtang004/archive/2013/05/17/200357.html</guid><wfw:comment>http://www.cppblog.com/shangtang004/comments/200357.html</wfw:comment><comments>http://www.cppblog.com/shangtang004/archive/2013/05/17/200357.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shangtang004/comments/commentRss/200357.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shangtang004/services/trackbacks/200357.html</trackback:ping><description><![CDATA[<div><ul> <li> <p>Make sure <tt>operator=</tt> is well-behaved when an object is  assigned to itself. Techniques include comparing addresses of source and target  objects, careful statement ordering, and copy-and-<tt>swap</tt>.</p> </li><li> <p>Make sure that any function operating on more than one object  behaves correctly if two or more of the objects are the same.</p></li></ul></div><img src ="http://www.cppblog.com/shangtang004/aggbug/200357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shangtang004/" target="_blank">魏尚堂</a> 2013-05-17 15:00 <a href="http://www.cppblog.com/shangtang004/archive/2013/05/17/200357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Have assignment operators return a reference to *this</title><link>http://www.cppblog.com/shangtang004/archive/2013/05/17/200356.html</link><dc:creator>魏尚堂</dc:creator><author>魏尚堂</author><pubDate>Fri, 17 May 2013 04:06:00 GMT</pubDate><guid>http://www.cppblog.com/shangtang004/archive/2013/05/17/200356.html</guid><wfw:comment>http://www.cppblog.com/shangtang004/comments/200356.html</wfw:comment><comments>http://www.cppblog.com/shangtang004/archive/2013/05/17/200356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shangtang004/comments/commentRss/200356.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shangtang004/services/trackbacks/200356.html</trackback:ping><description><![CDATA[<p>This is only a convention; code that doesn't follow it will  compile. However, the convention is followed by all the built-in types as well  as by all the types in &nbsp;the standard library (e.g.,  <tt>string</tt>, <tt>vector</tt>, <tt>complex</tt>, <tt>tr1::shared_ptr</tt>,  etc.). Unless you have a good reason for doing things differently, don't.</p><img src ="http://www.cppblog.com/shangtang004/aggbug/200356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shangtang004/" target="_blank">魏尚堂</a> 2013-05-17 12:06 <a href="http://www.cppblog.com/shangtang004/archive/2013/05/17/200356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Never call virtual functions during construction or destruction</title><link>http://www.cppblog.com/shangtang004/archive/2013/05/17/200355.html</link><dc:creator>魏尚堂</dc:creator><author>魏尚堂</author><pubDate>Fri, 17 May 2013 03:27:00 GMT</pubDate><guid>http://www.cppblog.com/shangtang004/archive/2013/05/17/200355.html</guid><wfw:comment>http://www.cppblog.com/shangtang004/comments/200355.html</wfw:comment><comments>http://www.cppblog.com/shangtang004/archive/2013/05/17/200355.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shangtang004/comments/commentRss/200355.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shangtang004/services/trackbacks/200355.html</trackback:ping><description><![CDATA[<div><div>base class constructors execute before derived class constructors, derived class  data members have not been initialized when base class constructors run. If  virtual functions called during base class construction went down to derived  classes, the derived class functions would almost certainly refer to local data  members, but those data members would not yet have been initialized.Calling down to parts of an object that have not yet been initialized is  inherently dangerous, so C++ gives you no way to do it.<br /><br />#include &lt;iostream&gt;</div></div><div>#include &lt;string&gt;</div><div>#include &lt;cstdlib&gt;</div><div>void print(std::string str){std::cout &lt;&lt; str&lt;&lt; std::endl;}</div><div>class Transaction {</div><div></div><div>&nbsp; &nbsp; public:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Transaction()</div><div>&nbsp; &nbsp; &nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("Transaction Constructor");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logTransaction();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; virtual void logTransaction() const <span style="background-color: yellow;">// =0;</span></div><div>&nbsp; &nbsp; &nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("Transaction Log");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>};</div><div></div><div>class BuyTransaction: public Transaction</div><div>{</div><div>&nbsp; &nbsp; public:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; BuyTransaction(){ &nbsp; print("BuyTransaction Constructor");}</div><div>&nbsp; &nbsp; &nbsp; &nbsp; virtual void logTransaction() const</div><div>&nbsp; &nbsp; &nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("BuyTransaction Log");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>};</div><div></div><div>int main()</div><div>{</div><div>&nbsp; &nbsp; BuyTransaction dbc;</div><div>&nbsp; &nbsp; //dbc.logTransaction();</div><div>}</div><div><span style="background-color: yellow;">pure virtual functions cannot link.</span></div><div>[shangtang@BTSOM-1 study]$ g++ TestT.cpp</div><div>TestT.cpp: In constructor 'Transaction::Transaction()':</div><div>TestT.cpp:14: warning: abstract virtual 'virtual void Transaction::logTransaction() const' called from constructor</div><div>/tmp/ccXFzaHv.o: In function `Transaction::Transaction()':</div><div>TestT.cpp:(.text._ZN11TransactionC2Ev[Transaction::Transaction()]+0x7f): undefined reference to `Transaction::logTransaction() const'</div><div>collect2: ld returned 1 exit status</div><div></div><div><span style="background-color: yellow;">virtual function can compile, run, but with surprise result</span></div><div>[shangtang@BTSOM-1 study]$ ./a.out</div><div>Transaction Constructor</div><div>Transaction Log</div><div>BuyTransaction Constructor<br /><br /><div>The only way to avoid this problem is to make sure that none of your  constructors or destructors call virtual functions on the object being created  or destroyed and that all the functions they call obey the same constraint.<br /></div></div><div></div><img src ="http://www.cppblog.com/shangtang004/aggbug/200355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shangtang004/" target="_blank">魏尚堂</a> 2013-05-17 11:27 <a href="http://www.cppblog.com/shangtang004/archive/2013/05/17/200355.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Prevent exceptions from leaving destructors</title><link>http://www.cppblog.com/shangtang004/archive/2013/05/17/200354.html</link><dc:creator>魏尚堂</dc:creator><author>魏尚堂</author><pubDate>Fri, 17 May 2013 02:56:00 GMT</pubDate><guid>http://www.cppblog.com/shangtang004/archive/2013/05/17/200354.html</guid><wfw:comment>http://www.cppblog.com/shangtang004/comments/200354.html</wfw:comment><comments>http://www.cppblog.com/shangtang004/archive/2013/05/17/200354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shangtang004/comments/commentRss/200354.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shangtang004/services/trackbacks/200354.html</trackback:ping><description><![CDATA[<div><div>Depending on the precise conditions under which such pairs of simultaneously  active exceptions arise, program execution either terminates or yields undefined  behavior. In this example, it yields undefined behavior.<br />C++ does not like destructors that emit  exceptions!</div>#include &lt;iostream&gt;</div><div>#include &lt;vector&gt;</div><div>struct Exception</div><div>{</div><div>&nbsp; &nbsp; Exception(){std::cout &lt;&lt; "Exception Constructor" &lt;&lt; std::endl;}</div><div>&nbsp; &nbsp; ~Exception(){std::cout &lt;&lt; "Exception Destructor" &lt;&lt; std::endl;}</div><div>};</div><div>class Widget {</div><div>public:</div><div>&nbsp; ~Widget() {std::cout &lt;&lt; "Widget Destructor" &lt;&lt; std::endl; throw Exception();</div><div>&nbsp; } &nbsp; &nbsp; &nbsp; &nbsp;//this might emit an exception</div><div>&nbsp; void print(){std::cout &lt;&lt; "print" &lt;&lt; std::endl;}</div><div>};</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div>void doSomething();</div><div></div><div>int main()</div><div>{</div><div>&nbsp; &nbsp; doSomething();</div><div>}</div><div></div><div>void doSomething()</div><div>{</div><div>&nbsp; std::vector&lt;Widget&gt; v;</div><div>&nbsp; v.push_back(Widget());</div><div>&nbsp; v.push_back(Widget());</div><div>&nbsp; v.push_back(Widget());</div><div>&nbsp; v.push_back(Widget());</div><div></div><div>&nbsp; std::vector&lt;Widget&gt;::iterator it = v.begin();</div><div>&nbsp; while(it != v.end())</div><div>&nbsp; {</div><div>&nbsp; &nbsp; std::cout &lt;&lt; "end" &lt;&lt; std::endl;</div><div>&nbsp; &nbsp; (*it).print();</div><div>&nbsp; &nbsp; it++;</div><div>&nbsp; }</div><div>}<br /><span style="background-color: yellow;">complie with g++</span></div><div>[shangtang@BTSOM-1 study]$ ./a.out</div><div>Widget Destructor</div><div>Exception Constructor</div><div>terminate called after throwing an instance of 'Exception'</div><div>Aborted (core dumped)<br /><div>There are two primary ways to avoid the trouble.<br /><br />&nbsp; &nbsp;1, Terminate the program if catch a exception,  typically by calling std::<tt>abort (cstdlib)<br />&nbsp; 2,&nbsp;</tt>Swallow the exception <font face="monospace">if catch a exception, print a log</font></div></div><img src ="http://www.cppblog.com/shangtang004/aggbug/200354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shangtang004/" target="_blank">魏尚堂</a> 2013-05-17 10:56 <a href="http://www.cppblog.com/shangtang004/archive/2013/05/17/200354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Virtual destructor from effective c++ edition 3</title><link>http://www.cppblog.com/shangtang004/archive/2013/05/13/200220.html</link><dc:creator>魏尚堂</dc:creator><author>魏尚堂</author><pubDate>Mon, 13 May 2013 06:45:00 GMT</pubDate><guid>http://www.cppblog.com/shangtang004/archive/2013/05/13/200220.html</guid><wfw:comment>http://www.cppblog.com/shangtang004/comments/200220.html</wfw:comment><comments>http://www.cppblog.com/shangtang004/archive/2013/05/13/200220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shangtang004/comments/commentRss/200220.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shangtang004/services/trackbacks/200220.html</trackback:ping><description><![CDATA[1, Declare destructors virtual in polymorphic base classes<br />why ? because C++ specifies that when a derived class object is deleted through a pointer to a  base class with a non-virtual destructor, results are undefined.What typically happens at runtime is that the derived part of the object is  never destroyed<br /><br />2, if a class is not intended to be a base class, making the destructor virtual is  usually a bad idea.&nbsp;<br />why? &nbsp;if a class have virtual functions, it has extra overhead(vptr).<br /><br />3, In fact, many people summarize the situation this way: declare a virtual  destructor in a class if and only if that class contains at least one virtual  function<br /><br />4,Sometimes, however, you have a class that you'd like to be abstract, but you  don't have any pure virtual functions.<br />solution: declare pure virtual destructor.<br />There is one twist, however you must provide a definition for the pure virtual destructor, or linker will complain.<br /><br />5, Not all base classes are designed to be used polymorphically. Neither the&nbsp;standard string type, for example, nor the STL container typesare designed to be base classes at all, much less polymorphic ones.<br /><br /><br /><div>&nbsp;</div><div>&nbsp;</div><img src ="http://www.cppblog.com/shangtang004/aggbug/200220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shangtang004/" target="_blank">魏尚堂</a> 2013-05-13 14:45 <a href="http://www.cppblog.com/shangtang004/archive/2013/05/13/200220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sizeof 是在编译时执行还是运行时</title><link>http://www.cppblog.com/shangtang004/archive/2013/01/24/197524.html</link><dc:creator>魏尚堂</dc:creator><author>魏尚堂</author><pubDate>Thu, 24 Jan 2013 02:26:00 GMT</pubDate><guid>http://www.cppblog.com/shangtang004/archive/2013/01/24/197524.html</guid><wfw:comment>http://www.cppblog.com/shangtang004/comments/197524.html</wfw:comment><comments>http://www.cppblog.com/shangtang004/archive/2013/01/24/197524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shangtang004/comments/commentRss/197524.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shangtang004/services/trackbacks/197524.html</trackback:ping><description><![CDATA[thinking in c++ 有下面的例子，不太理解为什么这个宏中的条件表达式在编译时就执行了，在此作个记号<br /><br />// A simple, compile-time assertion facility<br />#define STATIC_ASSERT(x) \<br />&nbsp; &nbsp;do { typedef int a[(x) ? 1 : -1]; }&nbsp;while(0)<br /><br />int main()<br />{<br />&nbsp; &nbsp;STATIC_ASSERT(sizeof(int) &lt;= sizeof(long)); &nbsp;// Passes<br />&nbsp; &nbsp;STATIC_ASSERT(sizeof(double) &lt;= sizeof(int)); // Fails&nbsp;<br />&nbsp;&nbsp;&nbsp;return 0;<br />}<img src ="http://www.cppblog.com/shangtang004/aggbug/197524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shangtang004/" target="_blank">魏尚堂</a> 2013-01-24 10:26 <a href="http://www.cppblog.com/shangtang004/archive/2013/01/24/197524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类模板中的友元函数</title><link>http://www.cppblog.com/shangtang004/archive/2013/01/21/197434.html</link><dc:creator>魏尚堂</dc:creator><author>魏尚堂</author><pubDate>Mon, 21 Jan 2013 02:48:00 GMT</pubDate><guid>http://www.cppblog.com/shangtang004/archive/2013/01/21/197434.html</guid><wfw:comment>http://www.cppblog.com/shangtang004/comments/197434.html</wfw:comment><comments>http://www.cppblog.com/shangtang004/archive/2013/01/21/197434.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shangtang004/comments/commentRss/197434.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shangtang004/services/trackbacks/197434.html</trackback:ping><description><![CDATA[template &lt;typename T&gt; class dataList<br />{<br />&nbsp;&nbsp;&nbsp;public:<br /><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friend ostream&amp; operator&lt;&lt;(ostream&amp; outStream, const dataList &lt;T&gt; &amp;outList);</div>}<br /><div>template &lt;typename T&gt; ostream&amp; operator&lt;&lt;(ostream&amp; outStream, const dataList &lt;T&gt; &amp;outList)<br />{<br />&nbsp; &nbsp;//....<br />&nbsp; &nbsp;return outStream;<br />}<br />int main(int argc, char* argv[])<br />{<br />&nbsp; &nbsp;dataList &lt;int&gt; testList;<br />&nbsp; &nbsp;cout &lt;&lt; testList;<br />}</div>这个程序员是链接不过，<br />错误信息：<br /><div>&nbsp;warning: friend declaration &#226;std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const dataList&lt;T&gt;&amp;)&#226; declares a non-template function</div><div>&nbsp;note: (if this is not what you intended, make sure the function template has already been declared and add &lt;&gt; after the function name here)</div><div>/tmp/cc9DSuka.o: In function `main':</div><div><span style="color: red;">undefined reference to</span> `operator&lt;&lt;(std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;, dataList&lt;int&gt; const&amp;)'</div><div>collect2: ld returned 1 exit status</div><div>错误原因解释<br /><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px;">The problem is that the compiler is not trying to use the templated&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">operator&lt;&lt;</code>&nbsp;you provided, but rather a non-templated version.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px;">When you declare a friend inside a class you are injecting the declaration of that function in the enclosing scope. The following code has the effect of declaring (and not defining) a free function that takes a&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">non_template_test</code>&nbsp;argument by constant reference:</p><pre prettyprint=""  prettyprinted"="" style="margin-top: 0px; margin-bottom: 10px; padding: 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow: auto; width: auto; max-height: 600px; line-height: 18px;"><code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;"><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">class</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> non_template_test </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">{</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">friend</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">void</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> f</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">(</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> non_template_test </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">const</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&amp;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">);</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">};</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray;">// declares here:</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray;">// void f( non_template_test const &amp; );</span></code></pre><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px;">The same happens with template classes, even if in this case it is a little less intuitive. When you declare (and not define) a friend function within the template class body, you are declaring a free function with that exact arguments. Note that you are declaring a function, not a template function:</p><pre prettyprint=""  prettyprinted"="" style="margin-top: 0px; margin-bottom: 10px; padding: 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow: auto; width: auto; max-height: 600px; line-height: 18px;"><code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;"><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">template</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">typename</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">class</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> template_test </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">{</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">friend</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">void</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> f</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">(</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> template_test</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">const</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&amp;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> t </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">);</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">};</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray;">// for each instantiating type T (int, double...) declares:</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray;">// void f( template_test&lt;int&gt; const &amp; );</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray;">// void f( template_test&lt;double&gt; const &amp; );</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">  </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #2b91af;">int</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> main</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">()</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">{</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">     template_test</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #800000;">&lt;int&gt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> t1</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">     template_test</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #800000;">&lt;double&gt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> t2</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">}</span></code></pre><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px;">Those free functions are declared but not defined. The tricky part here is that those free functions are not a template, but regular free functions being declared. When you add the template function into the mix you get:</p><pre prettyprint=""  prettyprinted"="" style="margin-top: 0px; margin-bottom: 10px; padding: 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow: auto; width: auto; max-height: 600px; line-height: 18px;"><code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;"><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">template</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">typename</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">class</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> template_test </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">{</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">friend</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">void</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> f</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">(</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> template_test</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">const</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&amp;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">);</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">};</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray;">// when instantiated with int, implicitly declares:</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray;">// void f( template_test&lt;int&gt; const &amp; );</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">  </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">template</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">typename</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">void</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> f</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">(</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> template_test</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">const</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&amp;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> x </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">)</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">{}</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray;">// 1</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">  </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #2b91af;">int</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> main</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">()</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">{</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">    template_test</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #800000;">&lt;int&gt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> t1</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">    f</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">(</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> t1 </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">);</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">}</span></code></pre><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px;">When the compiler hits the main function it instantiates the template&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">template_test</code>&nbsp;with type&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">int</code>and that declares the free function&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">void f( template_test&lt;int&gt; const &amp; )</code>&nbsp;that is not templated. When it finds the call&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">f( t1 )</code>&nbsp;there are two&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">f</code>&nbsp;symbols that match: the non-template&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">f( template_test&lt;int&gt; const &amp; )</code>&nbsp;declared (and not defined) when&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">template_test</code>&nbsp;was instantiated and the templated version that is both declared and defined at&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">1</code>. The non-templated version takes precedence and the compiler matches it.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px;">When the linker tries to resolve the non-templated version of&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">f</code>&nbsp;it cannot find the symbol and it thus fails.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px;">What can we do? There are two different solutions. In the first case we make the compiler provide non-templated functions for each instantiating type. In the second case we declare the templated version as a friend. They are subtly different, but in most cases equivalent.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">Having the compiler generate the non-templated functions for us:</strong></p><pre prettyprint=""  prettyprinted"="" style="margin-top: 0px; margin-bottom: 10px; padding: 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow: auto; width: auto; max-height: 600px; line-height: 18px;"><code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;"><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">template</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">typename</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">class</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> test  </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">{</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">friend</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">void</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> f</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">(</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> test</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">const</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&amp;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">)</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">{}</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">};</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray;">// implicitly</span></code></pre><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px;">This has the effect of creating as many non-templated free functions as needed. When the compiler finds the friend declaration within the template&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">test</code>&nbsp;it not only finds the declaration but also the implementation and adds both to the enclosing scope.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">Making the templated version a friend</strong></p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px;">To make the template a friend we must have it already declared and tell the compiler that the friend we want is actually a template and not a non-templated free function:</p><pre prettyprint=""  prettyprinted"="" style="margin-top: 0px; margin-bottom: 10px; padding: 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow: auto; width: auto; max-height: 600px; line-height: 18px;"><code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;"><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">template</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">typename</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">class</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> test</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray;">// forward declare the template class</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">template</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">typename</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">void</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> f</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">(</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> test</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">const</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&amp;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">);</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray;">// forward declare the template</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">template</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">typename</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">class</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> test </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">{</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">friend</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">void</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> f</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;&gt;(</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> test</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">const</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&amp;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">);</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray;">// declare f&lt;T&gt;( test&lt;T&gt; const &amp;) a friend</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">};</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">template</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">typename</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">void</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> f</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">(</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;"> test</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">T</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&gt;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b;">const</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">&amp;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">)</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent;">{}</span></code></pre><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px;">In this case, prior to declaring&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">f</code>&nbsp;as a template we must forward declare the template. To declare the&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">f</code>template we must first forward declare the&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;">test</code>&nbsp;template. The friend declaration is modified to include the angle brackets that identify that the element we are making a friend is actually a template and not a free function.<br />引用自&nbsp;<span style="font-family: verdana, 'courier new'; line-height: 21px;">http://stackoverflow.com/questions/1810753/overloading-operator-for-a-templated-class<br />从上面我可以学到一点：<br />1， 编译器匹配方法时非模板函数优先模板函数<br />2, 友元函数模板必须提前声明</span></p></div><img src ="http://www.cppblog.com/shangtang004/aggbug/197434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shangtang004/" target="_blank">魏尚堂</a> 2013-01-21 10:48 <a href="http://www.cppblog.com/shangtang004/archive/2013/01/21/197434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux link</title><link>http://www.cppblog.com/shangtang004/archive/2013/01/17/197339.html</link><dc:creator>魏尚堂</dc:creator><author>魏尚堂</author><pubDate>Thu, 17 Jan 2013 06:01:00 GMT</pubDate><guid>http://www.cppblog.com/shangtang004/archive/2013/01/17/197339.html</guid><wfw:comment>http://www.cppblog.com/shangtang004/comments/197339.html</wfw:comment><comments>http://www.cppblog.com/shangtang004/archive/2013/01/17/197339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shangtang004/comments/commentRss/197339.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shangtang004/services/trackbacks/197339.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/chen_dx/article/details/2463495" style="color: #000000; text-decoration: initial; font-family: 'Microsoft YaHei'; font-size: 20px; line-height: 30px; background-color: #ffffff;">Linux Shell的通配符与正则表达式</a>&nbsp;http://blog.csdn.net/chen_dx/article/details/2463495<img src ="http://www.cppblog.com/shangtang004/aggbug/197339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shangtang004/" target="_blank">魏尚堂</a> 2013-01-17 14:01 <a href="http://www.cppblog.com/shangtang004/archive/2013/01/17/197339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++ resource allocation new statement</title><link>http://www.cppblog.com/shangtang004/archive/2012/11/27/195721.html</link><dc:creator>魏尚堂</dc:creator><author>魏尚堂</author><pubDate>Tue, 27 Nov 2012 02:03:00 GMT</pubDate><guid>http://www.cppblog.com/shangtang004/archive/2012/11/27/195721.html</guid><wfw:comment>http://www.cppblog.com/shangtang004/comments/195721.html</wfw:comment><comments>http://www.cppblog.com/shangtang004/archive/2012/11/27/195721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shangtang004/comments/commentRss/195721.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shangtang004/services/trackbacks/195721.html</trackback:ping><description><![CDATA[<blockquote style="color: #000000; font-family: Arial, Arial, Helvetica; font-size: medium; line-height: normal; background-color: #ccffff;"><p style="font-size: 10pt; margin-top: 6px;"><strong>Perform every resource allocation (e.g., new) in its own code statement which immediately gives the new resource to a manager object (e.g., auto_ptr).</strong></p></blockquote><p style="font-size: 10pt; margin-top: 6px; font-family: Arial, Arial, Helvetica; line-height: normal; background-color: #ccffff;">This guideline is easy to understand and remember, it neatly avoids all of the exception safety problems in the original problem, and by mandating the use of manager objects it helps to avoid many other exception safety problems as well. This guideline is a good candidate for inclusion in your team's coding standards<br /><br />link&nbsp;http://www.gotw.ca/gotw/056.htm<br /><br /><div>file I/O http://www.zwqxin.com/archives/cpp/use-sstream.html</div><br /></p><img src ="http://www.cppblog.com/shangtang004/aggbug/195721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shangtang004/" target="_blank">魏尚堂</a> 2012-11-27 10:03 <a href="http://www.cppblog.com/shangtang004/archive/2012/11/27/195721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>