Files
hustoj/web/cppreference-zh/chmhelp/cpp-language-template_parameters.html
2025-08-01 12:57:54 +08:00

809 lines
93 KiB
HTML

<!DOCTYPE html>
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>&#27169;&#26495;&#24418;&#21442;&#19982;&#27169;&#26495;&#23454;&#21442;</title>
<link rel="stylesheet" href="ext.css" />
<link rel="stylesheet" href="site_modules.css" />
</head>
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_language_template_parameters skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">&#27169;&#26495;&#24418;&#21442;&#19982;&#27169;&#26495;&#23454;&#21442;</h1>
<div id="bodyContent">
<div id="contentSub"><span class="subpages">&lt; <a href="cpp.html">cpp</a>&lrm; | <a href="cpp-language.html">language</a></span></div>
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
<h3><span class="mw-headline" id=".E6.A8.A1.E6.9D.BF.E5.BD.A2.E5.8F.82">&#27169;&#26495;&#24418;&#21442;</span></h3>
<p>&#27599;&#20010;<a href="cpp-language-templates.html">&#27169;&#26495;</a>&#37117;&#20250;&#30001;&#19968;&#20010;&#25110;&#22810;&#20010;&#27169;&#26495;&#24418;&#21442;&#21442;&#25968;&#21270;&#65292;&#23427;&#20204;&#22312;&#27169;&#26495;&#22768;&#26126;&#35821;&#27861;&#20013;&#30340; <span class="t-spar">&#24418;&#21442;&#21015;&#34920;</span> &#20013;&#25351;&#23450;&#65306;</p>
<table class="t-sdsc-begin">
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td class="t-sdsc-nopad"><code><b>template</b></code> <code><b>&lt;</b></code> <span class="t-spar">&#24418;&#21442;&#21015;&#34920;</span> <code><b>&gt;</b></code> <span class="t-spar">&#22768;&#26126;</span></td>
<td class="t-sdsc-nopad"></td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
</table>
<p><span class="t-spar">&#24418;&#21442;&#21015;&#34920;</span> &#20013;&#30340;&#27599;&#20010;&#24418;&#21442;&#21487;&#20197;&#26159;&#65306;</p>
<ul>
<li>&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#65307;</li>
<li>&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#65307;</li>
<li>&#27169;&#26495;&#27169;&#26495;&#24418;&#21442;&#12290;</li>
</ul>
<h4><span class="mw-headline" id=".E9.9D.9E.E7.B1.BB.E5.9E.8B.E6.A8.A1.E6.9D.BF.E5.BD.A2.E5.8F.82">&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;</span></h4>
<table class="t-sdsc-begin">
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-spar">&#31867;&#22411;</span> <span class="t-spar">&#21517;&#23383;</span><span class="t-mark">(&#21487;&#36873;)</span></td>
<td>(1)</td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-spar">&#31867;&#22411;</span> <span class="t-spar">&#21517;&#23383;</span><span class="t-mark">(&#21487;&#36873;)</span> <code><b>=</b></code> <span class="t-spar">&#40664;&#35748;&#20540;</span></td>
<td>(2)</td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-spar">&#31867;&#22411;</span> <code><b>...</b></code> <span class="t-spar">&#21517;&#23383;</span><span class="t-mark">(&#21487;&#36873;)</span></td>
<td>(3)</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-spar">&#21344;&#20301;&#31526;</span> <span class="t-spar">&#21517;&#23383;</span></td>
<td>(4)</td>
<td><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
</table>
<div class="t-li1"><span class="t-li">1)</span> &#21487;&#20197;&#26377;&#21517;&#23383;&#30340;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#12290;</div>
<div class="t-li1"><span class="t-li">2)</span> &#21487;&#20197;&#26377;&#21517;&#23383;&#21644;&#40664;&#35748;&#20540;&#30340;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#12290;</div>
<div class="t-li1"><span class="t-li">3)</span> &#21487;&#20197;&#26377;&#21517;&#23383;&#30340;&#38750;&#31867;&#22411;&#27169;&#26495;<a href="cpp-language-parameter_pack.html">&#24418;&#21442;&#21253;</a>&#12290;</div>
<div class="t-li1"><span class="t-li">4)</span> &#24102;&#21344;&#20301;&#31526;&#31867;&#22411;&#30340;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#12290;<span class="t-spar">&#21344;&#20301;&#31526;</span> &#21487;&#20197;&#26159;&#21253;&#21547;&#21344;&#20301;&#31526; <a href="cpp-language-auto.html"><code>auto</code></a> &#30340;&#20219;&#20309;&#31867;&#22411;&#65288;&#20363;&#22914;&#21333;&#32431;&#30340; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">auto</span></span></span>&#12289;<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">auto</span> <span class="sy2">**</span></span></span> &#25110; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">auto</span> <span class="sy3">&amp;</span></span></span>&#65289;<span class="t-rev-inl t-since-cxx20"><span>&#65292;<a href="cpp-language-class_template_argument_deduction.html">&#34987;&#25512;&#23548;&#31867;&#31867;&#22411;&#30340;&#21344;&#20301;&#31526;</a></span> <span><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></span></span>&#65292;&#25110;&#32773; <span class="t-c"><span class="mw-geshi cpp source-cpp">decltype<span class="br0">(</span><span class="kw4">auto</span><span class="br0">)</span></span></span>&#12290;</div>
<p>&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#24517;&#39035;&#25317;&#26377;<i>&#32467;&#26500;&#21270;&#31867;&#22411;</i>&#65292;&#23427;&#26159;&#19979;&#21015;&#31867;&#22411;&#20043;&#19968;&#65288;&#21487;&#20197;&#26377; cv &#38480;&#23450;&#65292;&#24573;&#30053;&#38480;&#23450;&#31526;&#65289;&#65306;</p>
<ul>
<li>&#65288;&#21040;&#23545;&#35937;&#25110;&#20989;&#25968;&#30340;&#65289;<a href="cpp-language-reference.html#.E5.B7.A6.E5.80.BC.E5.BC.95.E7.94.A8">&#24038;&#20540;&#24341;&#29992;&#31867;&#22411;</a>&#65307;</li>
<li><a href="cpp-language-type.html">&#25972;&#25968;&#31867;&#22411;</a>&#65307;</li>
<li>&#65288;&#25351;&#21521;&#23545;&#35937;&#25110;&#20989;&#25968;&#30340;&#65289;<a href="cpp-language-pointer.html">&#25351;&#38024;&#31867;&#22411;</a>&#65307;</li>
<li>&#65288;&#25351;&#21521;&#25104;&#21592;&#23545;&#35937;&#25110;&#25104;&#21592;&#20989;&#25968;&#30340;&#65289;<a href="cpp-language-pointer.html#.E6.88.90.E5.91.98.E6.8C.87.E9.92.88">&#25104;&#21592;&#25351;&#38024;&#31867;&#22411;</a>&#65307;</li>
<li><a href="cpp-language-enum.html">&#26522;&#20030;&#31867;&#22411;</a>&#65307;</li>
</ul>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx11">
<td>
<ul>
<li><span class="t-lc"><a href="cpp-types-nullptr_t.html">std::nullptr_t</a></span> &#65307;</li>
</ul>
</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
</table>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx20">
<td>
<ul>
<li><a href="cpp-language-type.html">&#28014;&#28857;&#31867;&#22411;</a>&#65307;</li>
<li>&#25317;&#26377;&#19979;&#21015;&#23646;&#24615;&#30340;<a href="cpp-named_req-LiteralType.html">&#23383;&#38754;</a>&#31867;&#31867;&#22411;&#65306;</li>
</ul>
<dl>
<dd>
<ul>
<li>&#25152;&#26377;&#22522;&#31867;&#19982;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#20026;&#20844;&#24320;&#19988;&#38750; mutable &#19988;</li>
<li>&#25152;&#26377;&#22522;&#31867;&#19982;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#30340;&#31867;&#22411;&#22343;&#20026;&#32467;&#26500;&#21270;&#31867;&#22411;&#25110;&#20854;&#65288;&#21487;&#33021;&#22810;&#32500;&#30340;&#65289;&#25968;&#32452;&#12290;</li>
</ul>
</dd>
</dl>
</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
</table>
<p>&#25968;&#32452;&#19982;&#20989;&#25968;&#31867;&#22411;&#21487;&#20197;&#20889;&#22312;&#27169;&#26495;&#22768;&#26126;&#20013;&#65292;&#20294;&#23427;&#20204;&#20250;&#34987;&#33258;&#21160;&#26367;&#25442;&#20026;&#36866;&#21512;&#30340;&#23545;&#35937;&#25351;&#38024;&#21644;&#20989;&#25968;&#25351;&#38024;&#12290;</p>
<p>&#22312;&#31867;&#27169;&#26495;&#20307;&#20869;&#20351;&#29992;&#30340;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#30340;&#21517;&#23383;&#26159;&#19981;&#21487;&#20462;&#25913;&#30340;<a href="cpp-language-value_category.html">&#32431;&#21491;&#20540;</a>&#65292;&#38500;&#38750;&#23427;&#30340;&#31867;&#22411;&#26159;&#24038;&#20540;&#24341;&#29992;&#31867;&#22411;<span class="t-rev-inl t-since-cxx20"><span>&#25110;&#31867;&#31867;&#22411;</span> <span><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></span></span>&#12290;</p>
<p>&#24418;&#24335;&#20026; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">class</span> Foo</span></span> &#30340;&#27169;&#26495;&#24418;&#21442;&#19981;&#26159;&#31867;&#22411;&#20026; <code>Foo</code> &#30340;&#26080;&#21517;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#65292;&#34429;&#28982; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">class</span> Foo</span></span> &#36824;&#33021;&#26159;<a href="cpp-language-elaborated_type_specifier.html">&#35814;&#36848;&#31867;&#22411;&#35828;&#26126;&#31526;</a>&#19988; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">class</span> Foo x<span class="sy4">;</span></span></span> &#22768;&#26126; <code>x</code> &#20026; <code>Foo</code> &#31867;&#22411;&#30340;&#23545;&#35937;&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx17">
<td>
<p>&#22914;&#26524;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#30340;&#31867;&#22411;&#21253;&#21547;&#21344;&#20301;&#31526;&#31867;&#22411; <code>auto</code><span class="t-rev-inl t-since-cxx20"><span>&#65292;&#34987;&#25512;&#23548;&#31867;&#22411;&#30340;&#21344;&#20301;&#31526;</span> <span><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></span></span>&#65292;&#25110; <code>decltype(auto)</code>&#65292;&#37027;&#20040;&#23427;&#21487;&#20197;&#34987;&#25512;&#23548;&#12290;&#25512;&#23548;&#20250;&#22914;&#21516;&#22312;&#34394;&#35774;&#30340;&#22768;&#26126; <span class="t-c"><span class="mw-geshi cpp source-cpp">T x <span class="sy1">=</span> &#27169;&#26495;&#23454;&#21442;<span class="sy4">;</span></span></span> &#20013;&#25512;&#23548;&#21464;&#37327; <code>x</code> &#30340;&#31867;&#22411;&#19968;&#26679;&#36827;&#34892;&#65292;&#20854;&#20013; <code>T</code> &#26159;&#27169;&#26495;&#24418;&#21442;&#30340;&#22768;&#26126;&#31867;&#22411;&#12290;&#22914;&#26524;&#34987;&#25512;&#23548;&#30340;&#31867;&#22411;&#19981;&#33021;&#29992;&#20110;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#65292;&#37027;&#20040;&#31243;&#24207;&#38750;&#33391;&#26500;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">auto</span> n<span class="sy1">&gt;</span> <span class="kw1">struct</span> B <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span>
B<span class="sy1">&lt;</span><span class="nu0">5</span><span class="sy1">&gt;</span> b1<span class="sy4">;</span> <span class="co1">// OK&#65306;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#30340;&#31867;&#22411;&#26159; int</span>
B<span class="sy1">&lt;</span><span class="st0">&#39;a&#39;</span><span class="sy1">&gt;</span> b2<span class="sy4">;</span> <span class="co1">// OK&#65306;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#30340;&#31867;&#22411;&#26159; char</span>
B<span class="sy1">&lt;</span><span class="nu16">2.5</span><span class="sy1">&gt;</span> b3<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65288;C++20 &#21069;&#65289;&#65306;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#30340;&#31867;&#22411;&#19981;&#33021;&#26159; double</span></pre></div>
</div>
<p>&#23545;&#20110;&#31867;&#22411;&#20013;&#20351;&#29992;&#20102;&#21344;&#20301;&#31526;&#31867;&#22411;&#30340;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#21253;&#65292;&#27599;&#20010;&#27169;&#26495;&#23454;&#21442;&#30340;&#31867;&#22411;&#20250;&#29420;&#31435;&#36827;&#34892;&#25512;&#23548;&#65292;&#32780;&#19988;&#19981;&#38656;&#35201;&#20114;&#30456;&#21305;&#37197;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">auto</span>...<span class="sy1">&gt;</span> <span class="kw1">struct</span> C <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
C<span class="sy1">&lt;</span><span class="st0">&#39;C&#39;</span>, <span class="nu0">0</span>, <span class="nu0">2L</span>, nullptr<span class="sy1">&gt;</span> x<span class="sy4">;</span> <span class="co1">// OK</span></pre></div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></td>
</tr>
</table>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx20">
<td>
<p>&#25351;&#21517;&#31867;&#31867;&#22411; <code>T</code> &#30340;&#26576;&#20010;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#30340;<a href="cpp-language-identifiers.html">&#26631;&#35782;&#31526;</a>&#20195;&#34920;&#19968;&#20010; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">const</span> T</span></span> &#31867;&#22411;&#30340;&#38745;&#24577;&#23384;&#20648;&#26399;&#23545;&#35937;&#65292;&#35813;&#23545;&#35937;&#34987;&#31216;&#20026;<i>&#27169;&#26495;&#24418;&#21442;&#23545;&#35937;</i>&#65292;&#23427;&#30340;&#20540;&#26159;&#23545;&#24212;&#27169;&#26495;&#23454;&#21442;&#36716;&#25442;&#21040;&#27169;&#26495;&#24418;&#21442;&#30340;&#31867;&#22411;&#20043;&#21518;&#30340;&#20540;&#12290;&#31243;&#24207;&#20013;&#25152;&#26377;&#20855;&#26377;&#30456;&#21516;&#31867;&#22411;&#21644;&#20540;&#30340;&#36825;&#31181;&#27169;&#26495;&#24418;&#21442;&#37117;&#20195;&#34920;&#21516;&#19968;&#27169;&#26495;&#24418;&#21442;&#23545;&#35937;&#12290;&#27169;&#26495;&#24418;&#21442;&#23545;&#35937;&#24212;&#24403;&#25317;&#26377;<a href="cpp-language-constexpr.html#.E5.B8.B8.E9.87.8F.E6.9E.90.E6.9E.84">&#24120;&#37327;&#26512;&#26500;</a>&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> A <span class="br0">{</span> <span class="kw1">friend</span> <span class="kw4">bool</span> operator<span class="sy1">==</span><span class="br0">(</span><span class="kw4">const</span> A<span class="sy3">&amp;</span>, <span class="kw4">const</span> A<span class="sy3">&amp;</span><span class="br0">)</span> <span class="sy1">=</span> <span class="kw1">default</span><span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>A a<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<span class="sy3">&amp;</span>a<span class="sy4">;</span> <span class="co1">// OK</span>
<span class="kw4">const</span> A<span class="sy3">&amp;</span> ra <span class="sy1">=</span> a, <span class="sy3">&amp;</span>rb <span class="sy1">=</span> a<span class="sy4">;</span> <span class="co1">// &#37117;&#32465;&#23450;&#21040;&#21516;&#19968;&#20010;&#27169;&#26495;&#24418;&#21442;&#23545;&#35937;</span>
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span><span class="sy3">&amp;</span>ra <span class="sy1">==</span> <span class="sy3">&amp;</span>rb<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#36890;&#36807;</span>
<span class="br0">}</span></pre></div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
</table>
<h4><span class="mw-headline" id=".E7.B1.BB.E5.9E.8B.E6.A8.A1.E6.9D.BF.E5.BD.A2.E5.8F.82">&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;</span></h4>
<table class="t-sdsc-begin">
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-spar">&#31867;&#22411;&#24418;&#21442;&#20851;&#38190;&#35789;</span> <span class="t-spar">&#21517;&#23383;</span><span class="t-mark">(&#21487;&#36873;)</span></td>
<td>(1)</td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-spar">&#31867;&#22411;&#24418;&#21442;&#20851;&#38190;&#35789;</span> <span class="t-spar">&#21517;&#23383;</span><span class="t-mark">(&#21487;&#36873;)</span> <code><b>=</b></code> <span class="t-spar">&#40664;&#35748;&#20540;</span></td>
<td>(2)</td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-spar">&#31867;&#22411;&#24418;&#21442;&#20851;&#38190;&#35789;</span> <code><b>...</b></code> <span class="t-spar">&#21517;&#23383;</span><span class="t-mark">(&#21487;&#36873;)</span></td>
<td>(3)</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-spar">&#31867;&#22411;&#32422;&#26463;</span> <span class="t-spar">&#21517;&#23383;</span><span class="t-mark">(&#21487;&#36873;)</span></td>
<td>(4)</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-spar">&#31867;&#22411;&#32422;&#26463;</span> <span class="t-spar">&#21517;&#23383;</span><span class="t-mark">(&#21487;&#36873;)</span> <code><b>=</b></code> <span class="t-spar">&#40664;&#35748;&#20540;</span></td>
<td>(5)</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><span class="t-spar">&#31867;&#22411;&#32422;&#26463;</span> <code><b>...</b></code> <span class="t-spar">&#21517;&#23383;</span><span class="t-mark">(&#21487;&#36873;)</span></td>
<td>(6)</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
</table>
<table class="t-par-begin">
<tr class="t-par">
<td><span class="t-spar">&#31867;&#22411;&#24418;&#21442;&#20851;&#38190;&#35789;</span></td>
<td>-</td>
<td><code><b>typename</b></code> &#25110; <code><b>class</b></code> &#20043;&#19968;&#12290;&#36825;&#20004;&#20010;&#20851;&#38190;&#35789;&#22312;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#22768;&#26126;&#20013;&#27809;&#26377;&#21306;&#21035;</td>
</tr>
<tr class="t-par">
<td><span class="t-spar">&#31867;&#22411;&#32422;&#26463;</span></td>
<td>-</td>
<td><a href="cpp-language-constraints.html">&#27010;&#24565;</a>&#30340;&#21517;&#23383;&#25110;&#27010;&#24565;&#21517;&#21518;&#38543;&#27169;&#26495;&#23454;&#21442;&#21015;&#34920;&#65288;&#22312;&#35282;&#25324;&#21495;&#20013;&#65289;&#12290;&#27010;&#24565;&#21517;&#22343;&#23545;&#20110;&#20004;&#32773;&#37117;&#21487;&#20197;&#26377;&#38480;&#23450;</td>
</tr>
</table>
<div class="t-li1"><span class="t-li">1)</span> &#27809;&#26377;&#40664;&#35748;&#31867;&#22411;&#30340;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#12290;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw1">class</span> My_vector <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">2)</span> &#26377;&#40664;&#35748;&#31867;&#22411;&#30340;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#12290;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T <span class="sy1">=</span> <span class="kw4">void</span><span class="sy1">&gt;</span>
<span class="kw1">struct</span> My_op_functor <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">3)</span> &#31867;&#22411;&#27169;&#26495;<a href="cpp-language-parameter_pack.html">&#24418;&#21442;&#21253;</a>&#12290;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span>... <span class="me1">Ts</span><span class="sy1">&gt;</span>
<span class="kw1">class</span> My_tuple <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">4)</span> &#27809;&#26377;&#40664;&#35748;&#23454;&#21442;&#30340;&#21463;&#32422;&#26463;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#12290;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span> <span class="sy1">&lt;</span>My_concept T<span class="sy1">&gt;</span>
<span class="kw1">class</span> My_constrained_vector <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">5)</span> &#26377;&#40664;&#35748;&#23454;&#21442;&#30340;&#21463;&#32422;&#26463;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#12290;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span> <span class="sy1">&lt;</span>My_concept T <span class="sy1">=</span> <span class="kw4">void</span><span class="sy1">&gt;</span>
<span class="kw1">class</span> My_constrained_op_functor <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
</div>
<div class="t-li1"><span class="t-li">6)</span> &#21463;&#32422;&#26463;&#30340;&#31867;&#22411;&#27169;&#26495;<a href="cpp-language-parameter_pack.html">&#24418;&#21442;&#21253;</a>&#12290;
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span> <span class="sy1">&lt;</span>My_concept... <span class="me1">Ts</span><span class="sy1">&gt;</span>
<span class="kw1">class</span> My_constrained_tuple <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
</div>
<p>&#24418;&#21442;&#30340;&#21517;&#23383;&#26159;&#21487;&#36873;&#30340;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#23545;&#19978;&#38754;&#25152;&#31034;&#27169;&#26495;&#30340;&#22768;&#26126;&#65306;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span><span class="sy1">&gt;</span> <span class="kw1">class</span> My_vector<span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> <span class="sy1">=</span> <span class="kw4">void</span><span class="sy1">&gt;</span> <span class="kw1">struct</span> My_op_functor<span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span>...<span class="sy1">&gt;</span> <span class="kw1">class</span> My_tuple<span class="sy4">;</span></pre></div>
</div>
<p>&#22312;&#27169;&#26495;&#22768;&#26126;&#20307;&#20869;&#65292;&#31867;&#22411;&#24418;&#21442;&#30340;&#21517;&#23383;&#26159; typedef &#21517;&#23383;&#65292;&#23427;&#26159;&#24403;&#27169;&#26495;&#34987;&#23454;&#20363;&#21270;&#26102;&#25152;&#25552;&#20379;&#30340;&#31867;&#22411;&#30340;&#21035;&#21517;&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx20">
<td>
<p><span id=".E5.8F.97.E7.BA.A6.E6.9D.9F.E7.9A.84.E6.A8.A1.E6.9D.BF.E5.BD.A2.E5.8F.82"></span> &#23545;&#20110;&#27599;&#20010;&#21463;&#32422;&#26463;&#24418;&#21442; <code>P</code>&#65292;&#23427;&#30340; <span class="t-spar">&#31867;&#22411;&#32422;&#26463;</span> Q &#25351;&#23450;&#20102;&#27010;&#24565; <code>C</code>&#65292;&#37027;&#20040;&#26681;&#25454;&#20197;&#19979;&#35268;&#21017;&#24341;&#20837;&#19968;&#20010;<a href="cpp-language-constraints.html">&#32422;&#26463;&#34920;&#36798;&#24335;</a> <code>E</code>&#65306;</p>
<ul>
<li>&#22914;&#26524; <code>Q</code> &#26159; <code>C</code>&#65288;&#27809;&#26377;&#23454;&#21442;&#21015;&#34920;&#65289;&#65292;</li>
</ul>
<dl>
<dd>
<ul>
<li>&#22914;&#26524; <code>P</code> &#19981;&#26159;&#24418;&#21442;&#21253;&#65292;&#37027;&#20040; <code>E</code> &#26159; <code>C&lt;P&gt;</code></li>
<li>&#21542;&#21017;&#65292;<code>P</code> &#26159;&#24418;&#21442;&#21253;&#65292;&#37027;&#20040; <code>E</code> &#26159;&#25240;&#21472;&#34920;&#36798;&#24335; <code>(C&lt;P&gt; &amp;&amp; ...)</code></li>
</ul>
</dd>
</dl>
<ul>
<li>&#22914;&#26524; <code>Q</code> &#26159; <code>C&lt;A1,A2...,AN&gt;</code>&#65292;&#37027;&#20040; <code>E</code> &#20998;&#21035;&#26159; <code>C&lt;P,A1,A2,...AN&gt;</code> &#25110; <code>(C&lt;P,A1,A2,...AN&gt; &amp;&amp; ...)</code>&#12290;</li>
</ul>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> concept C1 <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span>... <span class="me1">Ts</span><span class="sy1">&gt;</span> concept C2 <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span> <span class="co1">// &#21464;&#21442;&#27010;&#24565;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T, <span class="kw1">typename</span> U<span class="sy1">&gt;</span> concept C3 <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>C1 T<span class="sy1">&gt;</span> <span class="kw1">struct</span> s1<span class="sy4">;</span> <span class="co1">// &#32422;&#26463;&#34920;&#36798;&#24335;&#20026; C1&lt;T&gt;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>C1... <span class="me1">T</span><span class="sy1">&gt;</span> <span class="kw1">struct</span> s2<span class="sy4">;</span> <span class="co1">// &#32422;&#26463;&#34920;&#36798;&#24335;&#20026; (C1&lt;T&gt; &amp;&amp; ...)</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>C2... <span class="me1">T</span><span class="sy1">&gt;</span> <span class="kw1">struct</span> s3<span class="sy4">;</span> <span class="co1">// &#32422;&#26463;&#34920;&#36798;&#24335;&#20026; (C2&lt;T&gt; &amp;&amp; ...)</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>C3<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> T<span class="sy1">&gt;</span> <span class="kw1">struct</span> s4<span class="sy4">;</span> <span class="co1">// &#32422;&#26463;&#34920;&#36798;&#24335;&#20026; C3&lt;T, int&gt;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span>C3<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span>... <span class="me1">T</span><span class="sy1">&gt;</span> <span class="kw1">struct</span> s5<span class="sy4">;</span> <span class="co1">// &#32422;&#26463;&#34920;&#36798;&#24335;&#20026; (C3&lt;T, int&gt; &amp;&amp; ...)</span></pre></div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
</table>
<h4><span class="mw-headline" id=".E6.A8.A1.E6.9D.BF.E6.A8.A1.E6.9D.BF.E5.BD.A2.E5.8F.82">&#27169;&#26495;&#27169;&#26495;&#24418;&#21442;</span></h4>
<table class="t-sdsc-begin">
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><code><b>template</b></code> <code><b>&lt;</b></code> <span class="t-spar">&#24418;&#21442;&#21015;&#34920;</span> <code><b>&gt;</b></code> <code><b>typename<span class="t-mark-rev t-since-cxx17">(C++17)</span>|class</b></code> <span class="t-spar">&#21517;&#23383;</span><span class="t-mark">(&#21487;&#36873;)</span></td>
<td>(1)</td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><code><b>template</b></code> <code><b>&lt;</b></code> <span class="t-spar">&#24418;&#21442;&#21015;&#34920;</span> <code><b>&gt;</b></code> <code><b>typename<span class="t-mark-rev t-since-cxx17">(C++17)</span>|class</b></code> <span class="t-spar">&#21517;&#23383;</span><span class="t-mark">(&#21487;&#36873;)</span> <code><b>=</b></code> <span class="t-spar">default</span></td>
<td>(2)</td>
<td class="t-sdsc-nopad"></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
<tr class="t-sdsc">
<td><code><b>template</b></code> <code><b>&lt;</b></code> <span class="t-spar">&#24418;&#21442;&#21015;&#34920;</span> <code><b>&gt;</b></code> <code><b>typename<span class="t-mark-rev t-since-cxx17">(C++17)</span>|class</b></code> <code><b>...</b></code> <span class="t-spar">&#21517;&#23383;</span><span class="t-mark">(&#21487;&#36873;)</span></td>
<td>(3)</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
<tr>
<td colspan="10" class="t-sdsc-sep"></td>
</tr>
</table>
<table class="t-par-begin">
<tr class="t-par">
<td><span class="t-spar">&#31867;&#22411;&#24418;&#21442;&#20851;&#38190;&#35789;</span></td>
<td>-</td>
<td><code><b>class</b></code> <span class="t-rev-inl t-since-cxx17"><span>&#25110; <code><b>typename</b></code> &#20043;&#19968;</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></span></span></td>
</tr>
</table>
<div class="t-li1"><span class="t-li">1)</span> &#21487;&#20197;&#26377;&#21517;&#23383;&#30340;&#27169;&#26495;&#27169;&#26495;&#24418;&#21442;&#12290;</div>
<div class="t-li1"><span class="t-li">2)</span> &#26377;&#40664;&#35748;&#27169;&#26495;&#19988;&#21487;&#20197;&#26377;&#21517;&#23383;&#30340;&#27169;&#26495;&#27169;&#26495;&#24418;&#21442;&#12290;</div>
<div class="t-li1"><span class="t-li">3)</span> &#21487;&#20197;&#26377;&#21517;&#23383;&#30340;&#27169;&#26495;&#27169;&#26495;<a href="cpp-language-parameter_pack.html">&#24418;&#21442;&#21253;</a>&#12290;</div>
<p>&#22312;&#27169;&#26495;&#22768;&#26126;&#20307;&#20869;&#65292;&#27492;&#24418;&#21442;&#30340;&#21517;&#23383;&#26159;&#19968;&#20010;&#27169;&#26495;&#21517;&#65288;&#19988;&#38656;&#35201;&#23454;&#21442;&#20197;&#23454;&#20363;&#21270;&#65289;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> <span class="kw1">class</span> my_array <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// &#20004;&#20010;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#21644;&#19968;&#20010;&#27169;&#26495;&#27169;&#26495;&#24418;&#21442;&#65306;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> K, <span class="kw1">typename</span> V, <span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span><span class="sy1">&gt;</span> <span class="kw1">typename</span> C <span class="sy1">=</span> my_array<span class="sy1">&gt;</span>
<span class="kw1">class</span> Map
<span class="br0">{</span>
C<span class="sy1">&lt;</span>K<span class="sy1">&gt;</span> key<span class="sy4">;</span>
C<span class="sy1">&lt;</span>V<span class="sy1">&gt;</span> value<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<h4><span class="mw-headline" id=".E6.A8.A1.E6.9D.BF.E5.BD.A2.E5.8F.82.E7.9A.84.E5.90.8D.E5.AD.97.E5.86.B3.E8.AE.AE">&#27169;&#26495;&#24418;&#21442;&#30340;&#21517;&#23383;&#20915;&#35758;</span></h4>
<p>&#27169;&#26495;&#24418;&#21442;&#30340;&#21517;&#23383;&#19981;&#33021;&#22312;&#23427;&#30340;&#20316;&#29992;&#22495;&#65288;&#21253;&#25324;&#20869;&#23884;&#20316;&#29992;&#22495;&#65289;&#20869;&#37325;&#22768;&#26126;&#12290;&#27169;&#26495;&#24418;&#21442;&#30340;&#21517;&#23383;&#19981;&#33021;&#19982;&#27169;&#26495;&#30340;&#21517;&#23383;&#30456;&#21516;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T, <span class="kw4">int</span> N<span class="sy1">&gt;</span>
<span class="kw1">class</span> Y <span class="br0">{</span>
<span class="kw4">int</span> T<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#37325;&#22768;&#26126;&#27169;&#26495;&#24418;&#21442;</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw4">char</span> T<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#37325;&#22768;&#26126;&#27169;&#26495;&#24418;&#21442;</span>
<span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> X<span class="sy1">&gt;</span> <span class="kw1">class</span> X<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#37325;&#22768;&#26126;&#27169;&#26495;&#24418;&#21442;</span></pre></div>
</div>
<p>&#22312;&#20986;&#29616;&#20110;&#31867;&#27169;&#26495;&#23450;&#20041;&#22806;&#30340;&#31867;&#27169;&#26495;&#25104;&#21592;&#23450;&#20041;&#20013;&#65292;&#31867;&#27169;&#26495;&#25104;&#21592;&#21517;&#20250;&#38544;&#34255;&#20219;&#20309;&#22806;&#22260;&#31867;&#27169;&#26495;&#30340;&#27169;&#26495;&#24418;&#21442;&#21517;&#65292;&#20294;&#22914;&#26524;&#35813;&#25104;&#21592;&#26159;&#31867;&#25110;&#20989;&#25968;&#27169;&#26495;&#21017;&#19981;&#38544;&#34255;&#35813;&#25104;&#21592;&#30340;&#27169;&#26495;&#24418;&#21442;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw1">struct</span> A <span class="br0">{</span>
<span class="kw1">struct</span> B <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">typedef</span> <span class="kw4">void</span> C<span class="sy4">;</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> U<span class="sy1">&gt;</span> <span class="kw4">void</span> g<span class="br0">(</span>U<span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> B<span class="sy1">&gt;</span>
<span class="kw4">void</span> A<span class="sy1">&lt;</span>B<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">f</span><span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
B b<span class="sy4">;</span> <span class="co1">// A &#30340; B &#65292;&#19981;&#26159;&#27169;&#26495;&#24418;&#21442;</span>
<span class="br0">}</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> B<span class="sy1">&gt;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> C<span class="sy1">&gt;</span>
<span class="kw4">void</span> A<span class="sy1">&lt;</span>B<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">g</span><span class="br0">(</span>C<span class="br0">)</span>
<span class="br0">{</span>
B b<span class="sy4">;</span> <span class="co1">// A &#30340; B &#65292;&#19981;&#26159;&#27169;&#26495;&#24418;&#21442;</span>
C c<span class="sy4">;</span> <span class="co1">// &#27169;&#26495;&#24418;&#21442; C &#65292;&#19981;&#26159; A &#30340; C</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#22312;&#20986;&#29616;&#20110;&#21547;&#35813;&#31867;&#27169;&#26495;&#23450;&#20041;&#30340;&#21629;&#21517;&#31354;&#38388;&#22806;&#30340;&#31867;&#27169;&#26495;&#25104;&#21592;&#23450;&#20041;&#20013;&#65292;&#27169;&#26495;&#24418;&#21442;&#21517;&#38544;&#34255;&#27492;&#21629;&#21517;&#31354;&#38388;&#30340;&#25104;&#21592;&#21517;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">namespace</span> N <span class="br0">{</span>
<span class="kw1">class</span> C <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw1">class</span> B <span class="br0">{</span>
<span class="kw4">void</span> f<span class="br0">(</span>T<span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> C<span class="sy1">&gt;</span>
<span class="kw4">void</span> N<span class="sy4">::</span><span class="me2">B</span><span class="sy1">&lt;</span>C<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">f</span><span class="br0">(</span>C<span class="br0">)</span>
<span class="br0">{</span>
C b<span class="sy4">;</span> <span class="co1">// C &#26159;&#27169;&#26495;&#24418;&#21442;&#65292;&#19981;&#26159; N::C</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#22312;&#31867;&#27169;&#26495;&#23450;&#20041;&#20013;&#65292;&#25110;&#20986;&#29616;&#20110;&#27169;&#26495;&#23450;&#20041;&#22806;&#30340;&#36825;&#31181;&#25104;&#21592;&#30340;&#23450;&#20041;&#20013;&#65292;&#23545;&#20110;&#27599;&#20010;&#38750;<a href="cpp-language-dependent_name.html#.E5.BE.85.E5.86.B3.E7.B1.BB.E5.9E.8B">&#24453;&#20915;</a>&#22522;&#31867;&#65292;&#22914;&#26524;&#22522;&#31867;&#21517;&#25110;&#22522;&#31867;&#25104;&#21592;&#21517;&#19982;&#27169;&#26495;&#24418;&#21442;&#21517;&#30456;&#21516;&#65292;&#37027;&#20040;&#35813;&#22522;&#31867;&#21517;&#25110;&#25104;&#21592;&#21517;&#38544;&#34255;&#27169;&#26495;&#24418;&#21442;&#21517;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> A <span class="br0">{</span>
<span class="kw1">struct</span> B <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> C<span class="sy4">;</span>
<span class="kw4">int</span> Y<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> B, <span class="kw1">class</span> C<span class="sy1">&gt;</span>
<span class="kw1">struct</span> X <span class="sy4">:</span> A <span class="br0">{</span>
B b<span class="sy4">;</span> <span class="co1">// A &#30340; B</span>
C b<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306; A &#30340; C &#19981;&#26159;&#31867;&#22411;&#21517;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<h3><span class="mw-headline" id=".E6.A8.A1.E6.9D.BF.E5.AE.9E.E5.8F.82">&#27169;&#26495;&#23454;&#21442;</span></h3>
<p>&#20026;&#20351;&#27169;&#26495;&#34987;&#23454;&#20363;&#21270;&#65292;&#23427;&#30340;&#27599;&#20010;&#27169;&#26495;&#24418;&#21442;&#65288;&#31867;&#22411;&#12289;&#38750;&#31867;&#22411;&#25110;&#27169;&#26495;&#65289;&#37117;&#24517;&#39035;&#34987;&#19968;&#20010;&#23545;&#24212;&#30340;&#27169;&#26495;&#23454;&#21442;&#26367;&#25442;&#12290;&#23545;&#20110;<a href="cpp-language-class_template.html">&#31867;&#27169;&#26495;</a>&#65292;&#23454;&#21442;&#21487;&#20197;&#34987;&#26174;&#24335;&#25552;&#20379;<span class="t-rev-inl t-since-cxx17"><span>&#65292;&#25110;<a href="cpp-language-class_template_argument_deduction.html">&#20174;&#21021;&#22987;&#21270;&#22120;&#25512;&#23548;</a>&#65292;</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></span></span>&#25110;&#20026;&#40664;&#35748;&#12290;&#23545;&#20110;<a href="cpp-language-function_template.html">&#20989;&#25968;&#27169;&#26495;</a>&#65292;&#23454;&#21442;&#21487;&#20197;&#34987;&#26174;&#24335;&#25552;&#20379;&#65292;&#25110;<a href="cpp-language-template_argument_deduction.html">&#20174;&#35821;&#22659;&#25512;&#23548;</a>&#65292;&#25110;&#20026;&#40664;&#35748;&#12290;</p>
<p>&#22914;&#26524;&#23454;&#21442;&#21487;&#20197;&#21516;&#26102;&#34987;&#35299;&#37322;&#20026;<a href="cpp-language-type.html#.E7.B1.BB.E5.9E.8B.E7.9A.84.E5.91.BD.E5.90.8D">&#31867;&#22411;&#26631;&#35782;</a>&#21644;&#34920;&#36798;&#24335;&#65292;&#37027;&#20040;&#23427;&#22987;&#32456;&#20250;&#34987;&#35299;&#37322;&#20026;&#31867;&#22411;&#26631;&#35782;&#65292;&#21363;&#20351;&#23427;&#23545;&#24212;&#30340;&#26159;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #1</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span> I<span class="sy1">&gt;</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// #2</span>
<span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
f<span class="sy1">&lt;</span><span class="kw4">int</span><span class="br0">(</span><span class="br0">)</span><span class="sy1">&gt;</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &quot;int()&quot; &#26082;&#26159;&#31867;&#22411;&#21448;&#26159;&#34920;&#36798;&#24335;&#65292;</span>
<span class="co1">// &#22240;&#20026;&#23427;&#34987;&#35299;&#37322;&#25104;&#31867;&#22411;&#65292;&#25152;&#20197;&#35843;&#29992; #1</span>
<span class="br0">}</span></pre></div>
</div>
<h4><span class="mw-headline" id=".E6.A8.A1.E6.9D.BF.E9.9D.9E.E7.B1.BB.E5.9E.8B.E5.AE.9E.E5.8F.82">&#27169;&#26495;&#38750;&#31867;&#22411;&#23454;&#21442;</span></h4>
<p>&#22312;&#23454;&#20363;&#21270;&#25317;&#26377;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#30340;&#27169;&#26495;&#26102;&#24212;&#29992;&#19979;&#21015;&#38480;&#21046;&#65306;</p>
<table class="t-rev-begin">
<tr class="t-rev t-until-cxx17">
<td>
<ul>
<li>&#23545;&#20110;&#25972;&#22411;&#21644;&#31639;&#26415;&#31867;&#22411;&#65292;&#23454;&#20363;&#21270;&#26102;&#25152;&#25552;&#20379;&#30340;&#27169;&#26495;&#23454;&#21442;&#24517;&#39035;&#26159;&#27169;&#26495;&#24418;&#21442;&#31867;&#22411;&#30340;<a href="cpp-language-constant_expression.html">&#32463;&#36716;&#25442;&#24120;&#37327;&#34920;&#36798;&#24335;</a>&#65288;&#22240;&#27492;&#36866;&#29992;&#26576;&#20123;&#38544;&#24335;&#36716;&#25442;&#65289;&#12290;</li>
<li>&#23545;&#20110;&#23545;&#35937;&#25351;&#38024;&#65292;&#27169;&#26495;&#23454;&#21442;&#24517;&#39035;&#25351;&#23450;&#26576;&#20010;&#20855;&#26377;&#38745;&#24577;<a href="cpp-language-storage_duration.html">&#23384;&#20648;&#26399;</a>&#21644;&#65288;&#20869;&#37096;&#25110;&#22806;&#37096;&#65289;<a href="cpp-language-storage_duration.html#.E8.BF.9E.E6.8E.A5">&#36830;&#25509;</a>&#30340;&#23436;&#25972;&#23545;&#35937;&#30340;&#22320;&#22336;&#65292;&#25110;&#32773;&#26159;&#27714;&#20540;&#20026;&#36866;&#24403;&#30340;&#31354;&#25351;&#38024;&#25110; <span class="t-lc"><a href="cpp-types-nullptr_t.html">std::nullptr_t</a></span> &#20540;&#30340;&#24120;&#37327;&#34920;&#36798;&#24335;&#12290;</li>
<li>&#23545;&#20110;&#20989;&#25968;&#25351;&#38024;&#65292;&#21512;&#27861;&#30340;&#23454;&#21442;&#26159;&#25351;&#21521;&#20855;&#26377;&#36830;&#25509;&#30340;&#20989;&#25968;&#30340;&#25351;&#38024;&#65288;&#25110;&#27714;&#20540;&#20026;&#31354;&#25351;&#38024;&#20540;&#30340;&#24120;&#37327;&#34920;&#36798;&#24335;&#65289;&#12290;</li>
<li>&#23545;&#20110;&#24038;&#20540;&#24341;&#29992;&#24418;&#21442;&#65292;&#23454;&#20363;&#21270;&#26102;&#25152;&#25552;&#20379;&#30340;&#23454;&#21442;&#19981;&#33021;&#26159;&#20020;&#26102;&#37327;&#12289;&#26080;&#21517;&#24038;&#20540;&#25110;&#26080;&#36830;&#25509;&#30340;&#20855;&#21517;&#24038;&#20540;&#65288;&#25442;&#35328;&#20043;&#65292;&#23454;&#21442;&#24517;&#39035;&#20855;&#26377;&#36830;&#25509;&#65289;&#12290;</li>
<li>&#23545;&#20110;&#25104;&#21592;&#25351;&#38024;&#65292;&#23454;&#21442;&#24517;&#39035;&#26159;&#34920;&#31034;&#25104; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">&amp;</span>Class<span class="sy4">::</span><span class="me2">Member</span></span></span> &#30340;&#25104;&#21592;&#25351;&#38024;&#65292;&#25110;&#27714;&#20540;&#20026;&#31354;&#25351;&#38024;&#20540;&#25110; <span class="t-lc"><a href="cpp-types-nullptr_t.html">std::nullptr_t</a></span> &#20540;&#30340;&#24120;&#37327;&#34920;&#36798;&#24335;&#12290;</li>
</ul>
<p>&#29305;&#21035;&#26159;&#65292;&#36825;&#24847;&#21619;&#30528;&#23383;&#31526;&#20018;&#23383;&#38754;&#37327;&#12289;&#25968;&#32452;&#20803;&#32032;&#30340;&#22320;&#22336;&#21644;&#38750;&#38745;&#24577;&#25104;&#21592;&#30340;&#22320;&#22336;&#65292;&#19981;&#33021;&#34987;&#29992;&#20316;&#27169;&#26495;&#23454;&#21442;&#65292;&#26469;&#23454;&#20363;&#21270;&#20854;&#23545;&#24212;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#26159;&#23545;&#35937;&#25351;&#38024;&#30340;&#27169;&#26495;&#24418;&#21442;&#30340;&#27169;&#26495;&#12290;</p>
</td>
<td><span class="t-mark-rev t-until-cxx17">(C++17 &#21069;)</span></td>
</tr>
<tr class="t-rev t-since-cxx17">
<td>
<p>&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#21487;&#20197;&#20351;&#29992;&#30340;&#27169;&#26495;&#23454;&#21442;&#65292;&#21487;&#20197;&#26159;&#35813;&#27169;&#26495;&#24418;&#21442;&#31867;&#22411;&#30340;&#20219;&#20309;<a href="cpp-language-constant_expression.html">&#32463;&#36716;&#25442;&#24120;&#37327;&#34920;&#36798;&#24335;</a>&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">const</span> <span class="kw4">int</span><span class="sy2">*</span> pci<span class="sy1">&gt;</span> <span class="kw1">struct</span> X <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> ai<span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="sy4">;</span>
X<span class="sy1">&lt;</span>ai<span class="sy1">&gt;</span> xi<span class="sy4">;</span> <span class="co1">// OK&#65306;&#25968;&#32452;&#21040;&#25351;&#38024;&#36716;&#25442;&#21644; cv &#38480;&#23450;&#36716;&#25442;</span>
<span class="kw1">struct</span> Y <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">const</span> Y<span class="sy3">&amp;</span> b<span class="sy1">&gt;</span> <span class="kw1">struct</span> Z <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
Y y<span class="sy4">;</span>
Z<span class="sy1">&lt;</span>y<span class="sy1">&gt;</span> z<span class="sy4">;</span> <span class="co1">// OK&#65306;&#27809;&#26377;&#36716;&#25442;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span> <span class="br0">(</span><span class="sy3">&amp;</span>pa<span class="br0">)</span><span class="br0">[</span><span class="nu0">5</span><span class="br0">]</span><span class="sy1">&gt;</span> <span class="kw1">struct</span> W <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> b<span class="br0">[</span><span class="nu0">5</span><span class="br0">]</span><span class="sy4">;</span>
W<span class="sy1">&lt;</span>b<span class="sy1">&gt;</span> w<span class="sy4">;</span> <span class="co1">// OK&#65306;&#27809;&#26377;&#36716;&#25442;</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">char</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">void</span> <span class="br0">(</span><span class="sy2">*</span>pf<span class="br0">)</span><span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy1">&gt;</span> <span class="kw1">struct</span> A <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
A<span class="sy1">&lt;</span><span class="sy3">&amp;</span>f<span class="sy1">&gt;</span> a<span class="sy4">;</span> <span class="co1">// OK&#65306;&#37325;&#36733;&#20915;&#35758;&#36873;&#25321; f(int)</span></pre></div>
</div>
<p>&#20165;&#26377;&#30340;&#20363;&#22806;&#26159;<i>&#24341;&#29992;</i>&#25110;<i>&#25351;&#38024;</i>&#31867;&#22411;&#30340;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;<span class="t-rev-inl t-since-cxx20"><span>&#20197;&#21450;&#31867;&#31867;&#22411;&#30340;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#21450;&#20854;&#23376;&#23545;&#35937;&#20043;&#20013;&#30340;&#24341;&#29992;&#25110;&#25351;&#38024;&#31867;&#22411;&#30340;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;</span> <span><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></span></span>&#65292;&#23427;&#20204;&#19981;&#33021;&#25351;&#20195;&#19979;&#21015;&#23545;&#35937;&#25110;&#32773;&#26159;&#19979;&#21015;&#23545;&#35937;&#30340;&#22320;&#22336;&#65306;</p>
<ul>
<li>&#20020;&#26102;&#23545;&#35937;&#65288;&#21253;&#25324;&#22312;<a href="cpp-language-reference_initialization.html">&#24341;&#29992;&#21021;&#22987;&#21270;</a>&#26399;&#38388;&#21019;&#24314;&#30340;&#23545;&#35937;&#65289;&#65307;</li>
<li><a href="cpp-language-string_literal.html">&#23383;&#31526;&#20018;&#23383;&#38754;&#37327;</a>&#65307;</li>
<li><a href="cpp-language-typeid.html"><code>typeid</code></a> &#30340;&#32467;&#26524;&#65307;</li>
<li>&#39044;&#23450;&#20041;&#21464;&#37327; <span class="t-c"><span class="mw-geshi cpp source-cpp">__func__</span></span>&#65307;</li>
<li>&#25110;<span class="t-rev-inl t-since-cxx20"><span>&#20197;&#19978;&#20043;&#19968;&#30340;</span> <span><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></span></span>&#23376;&#23545;&#35937;&#65288;&#21253;&#25324;&#38750;&#38745;&#24577;&#31867;&#25104;&#21592;&#12289;&#22522;&#31867;&#23376;&#23545;&#35937;&#25110;&#25968;&#32452;&#20803;&#32032;&#65289;&#12290;</li>
</ul>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T, <span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> p<span class="sy1">&gt;</span> <span class="kw1">class</span> X <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
X<span class="sy1">&lt;</span><span class="kw4">int</span>, <span class="st0">&quot;Studebaker&quot;</span><span class="sy1">&gt;</span> x1<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#23558;&#23383;&#31526;&#20018;&#23383;&#38754;&#37327;&#29992;&#20316;&#27169;&#26495;&#23454;&#21442;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy2">*</span> p<span class="sy1">&gt;</span> <span class="kw1">class</span> X <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> a<span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="sy4">;</span>
<span class="kw1">struct</span> S
<span class="br0">{</span>
<span class="kw4">int</span> m<span class="sy4">;</span>
<span class="kw4">static</span> <span class="kw4">int</span> s<span class="sy4">;</span>
<span class="br0">}</span> s<span class="sy4">;</span>
X<span class="sy1">&lt;</span><span class="sy3">&amp;</span>a<span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span><span class="sy1">&gt;</span> x3<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65288;C++20 &#21069;&#65289;&#65306;&#25968;&#32452;&#20803;&#32032;&#30340;&#22320;&#22336;</span>
X<span class="sy1">&lt;</span><span class="sy3">&amp;</span>s.<span class="me1">m</span><span class="sy1">&gt;</span> x4<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65288;C++20 &#21069;&#65289;&#65306;&#38750;&#38745;&#24577;&#25104;&#21592;&#30340;&#22320;&#22336;</span>
X<span class="sy1">&lt;</span><span class="sy3">&amp;</span>s.<span class="me1">s</span><span class="sy1">&gt;</span> x5<span class="sy4">;</span> <span class="co1">// OK&#65306;&#38745;&#24577;&#25104;&#21592;&#30340;&#22320;&#22336;</span>
X<span class="sy1">&lt;</span><span class="sy3">&amp;</span>S<span class="sy4">::</span><span class="me2">s</span><span class="sy1">&gt;</span> x6<span class="sy4">;</span> <span class="co1">// OK&#65306;&#38745;&#24577;&#25104;&#21592;&#30340;&#22320;&#22336;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">const</span> <span class="kw4">int</span><span class="sy3">&amp;</span> CRI<span class="sy1">&gt;</span> <span class="kw1">struct</span> B <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
B<span class="sy1">&lt;</span><span class="nu0">1</span><span class="sy1">&gt;</span> b2<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#27169;&#26495;&#23454;&#21442;&#35201;&#27714;&#20020;&#26102;&#37327;</span>
<span class="kw4">int</span> c <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
B<span class="sy1">&lt;</span>c<span class="sy1">&gt;</span> b1<span class="sy4">;</span> <span class="co1">// OK</span></pre></div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></td>
</tr>
</table>
<h4><span class="mw-headline" id=".E6.A8.A1.E6.9D.BF.E7.B1.BB.E5.9E.8B.E5.AE.9E.E5.8F.82">&#27169;&#26495;&#31867;&#22411;&#23454;&#21442;</span></h4>
<p>&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#30340;&#27169;&#26495;&#23454;&#21442;&#24517;&#39035;&#26159;<a href="cpp-language-type.html#.E7.B1.BB.E5.9E.8B.E7.9A.84.E5.91.BD.E5.90.8D">&#31867;&#22411;&#26631;&#35782;</a>&#65292;&#23427;&#21487;&#20197;&#25351;&#21517;&#19981;&#23436;&#25972;&#31867;&#22411;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> <span class="kw1">class</span> X <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#31867;&#27169;&#26495;</span>
<span class="kw1">struct</span> A<span class="sy4">;</span> <span class="co1">// &#19981;&#23436;&#25972;&#31867;&#22411;</span>
<span class="kw1">typedef</span> <span class="kw1">struct</span> <span class="br0">{</span><span class="br0">}</span> B<span class="sy4">;</span> <span class="co1">// &#26080;&#21517;&#31867;&#22411;&#30340;&#31867;&#22411;&#21035;&#21517;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
X<span class="sy1">&lt;</span>A<span class="sy1">&gt;</span> x1<span class="sy4">;</span> <span class="co1">// ok&#65306;&#39;A&#39; &#25351;&#21517;&#31867;&#22411;</span>
X<span class="sy1">&lt;</span>A<span class="sy2">*</span><span class="sy1">&gt;</span> x2<span class="sy4">;</span> <span class="co1">// ok&#65306;&#39;A*&#39; &#25351;&#21517;&#31867;&#22411;</span>
X<span class="sy1">&lt;</span>B<span class="sy1">&gt;</span> x3<span class="sy4">;</span> <span class="co1">// ok&#65306;&#39;B&#39; &#25351;&#21517;&#31867;&#22411;</span>
<span class="br0">}</span></pre></div>
</div>
<h4><span class="mw-headline" id=".E6.A8.A1.E6.9D.BF.E6.A8.A1.E6.9D.BF.E5.AE.9E.E5.8F.82">&#27169;&#26495;&#27169;&#26495;&#23454;&#21442;</span></h4>
<p>&#27169;&#26495;&#27169;&#26495;&#24418;&#21442;&#30340;&#27169;&#26495;&#23454;&#21442;&#26159;&#24517;&#39035;&#26159;&#19968;&#20010; <a href="cpp-language-identifiers.html#.E5.9C.A8.E8.A1.A8.E8.BE.BE.E5.BC.8F.E4.B8.AD">&#26631;&#35782;&#34920;&#36798;&#24335;</a>&#65292;&#23427;&#25351;&#21517;&#19968;&#20010;&#31867;&#27169;&#26495;&#25110;&#27169;&#26495;&#21035;&#21517;&#12290;</p>
<p>&#24403;&#23454;&#21442;&#26159;&#31867;&#27169;&#26495;&#26102;&#65292;&#36827;&#34892;&#24418;&#21442;&#21305;&#37197;&#26102;&#21482;&#32771;&#34385;&#20854;&#20027;&#27169;&#26495;&#12290;&#37096;&#20998;&#29305;&#21270;&#33509;&#23384;&#22312;&#65292;&#20063;&#20165;&#22312;&#22522;&#20110;&#27492;&#27169;&#26495;&#27169;&#26495;&#24418;&#21442;&#30340;&#29305;&#21270;&#24688;&#22909;&#35201;&#34987;&#23454;&#20363;&#21270;&#26102;&#25165;&#20104;&#20197;&#32771;&#34385;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> <span class="kw1">class</span> A <span class="br0">{</span> <span class="kw4">int</span> x<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#20027;&#27169;&#26495;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> <span class="kw1">class</span> A<span class="sy1">&lt;</span>T<span class="sy2">*</span><span class="sy1">&gt;</span> <span class="br0">{</span> <span class="kw4">long</span> x<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#37096;&#20998;&#29305;&#21270;</span>
<span class="co1">// &#24102;&#26377;&#27169;&#26495;&#27169;&#26495;&#24418;&#21442; V &#30340;&#31867;&#27169;&#26495;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span><span class="sy1">&gt;</span> <span class="kw1">class</span> V<span class="sy1">&gt;</span> <span class="kw1">class</span> C
<span class="br0">{</span>
V<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> y<span class="sy4">;</span> <span class="co1">// &#20351;&#29992;&#20027;&#27169;&#26495;</span>
V<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy2">*</span><span class="sy1">&gt;</span> z<span class="sy4">;</span> <span class="co1">// &#20351;&#29992;&#37096;&#20998;&#29305;&#21270;</span>
<span class="br0">}</span><span class="sy4">;</span>
C<span class="sy1">&lt;</span>A<span class="sy1">&gt;</span> c<span class="sy4">;</span> <span class="co1">// c.y.x &#31867;&#22411;&#20026; int&#65292;c.z.x &#31867;&#22411;&#20026; long</span></pre></div>
</div>
<p>&#20026;&#21305;&#37197;&#27169;&#26495;&#27169;&#26495;&#23454;&#21442; <code>A</code> &#19982;&#27169;&#26495;&#27169;&#26495;&#24418;&#21442; <code>P</code>&#65292;<span class="t-rev-inl t-until-cxx17"><span><code>A</code> &#30340;&#27599;&#20010;&#27169;&#26495;&#24418;&#21442;&#24517;&#39035;&#19982; <code>P</code> &#30340;&#23545;&#24212;&#27169;&#26495;&#24418;&#21442;&#20005;&#26684;&#21305;&#37197;</span> <span><span class="t-mark-rev t-until-cxx17">(C++17 &#21069;)</span></span></span><span class="t-rev-inl t-since-cxx17"><span><code>P</code> &#24517;&#39035;&#33267;&#23569;&#19982; <code>A</code> &#19968;&#26679;&#29305;&#27530;</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></span></span>&#12290;&#33509; <code>P</code> &#30340;&#24418;&#21442;&#21015;&#34920;&#21253;&#21547;&#19968;&#20010;<a href="cpp-language-parameter_pack.html">&#24418;&#21442;&#21253;</a>&#65292;&#21017;&#26469;&#33258; <code>A</code> &#30340;&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;&#20013;&#30340;&#38646;&#25110;&#26356;&#22810;&#27169;&#26495;&#24418;&#21442;&#65288;&#25110;&#24418;&#21442;&#21253;&#65289;&#19982;&#20043;&#21305;&#37197;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> <span class="kw1">struct</span> eval<span class="sy4">;</span> <span class="co1">// &#20027;&#27169;&#26495; </span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span>, <span class="kw1">typename</span>...<span class="sy1">&gt;</span> <span class="kw1">class</span> TT, <span class="kw1">typename</span> T1, <span class="kw1">typename</span>... <span class="me1">Rest</span><span class="sy1">&gt;</span>
<span class="kw1">struct</span> eval<span class="sy1">&lt;</span>TT<span class="sy1">&lt;</span>T1, Rest...<span class="sy1">&gt;&gt;</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// eval &#30340;&#37096;&#20998;&#29305;&#21270;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T1<span class="sy1">&gt;</span> <span class="kw1">struct</span> A<span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T1, <span class="kw1">typename</span> T2<span class="sy1">&gt;</span> <span class="kw1">struct</span> B<span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span> N<span class="sy1">&gt;</span> <span class="kw1">struct</span> C<span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T1, <span class="kw4">int</span> N<span class="sy1">&gt;</span> <span class="kw1">struct</span> D<span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T1, <span class="kw1">typename</span> T2, <span class="kw4">int</span> N <span class="sy1">=</span> <span class="nu0">17</span><span class="sy1">&gt;</span> <span class="kw1">struct</span> E<span class="sy4">;</span>
eval<span class="sy1">&lt;</span>A<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;&gt;</span> eA<span class="sy4">;</span> <span class="co1">// ok&#65306;&#21305;&#37197; eval &#30340;&#37096;&#20998;&#29305;&#21270;</span>
eval<span class="sy1">&lt;</span>B<span class="sy1">&lt;</span><span class="kw4">int</span>, <span class="kw4">float</span><span class="sy1">&gt;&gt;</span> eB<span class="sy4">;</span> <span class="co1">// ok&#65306;&#21305;&#37197; eval &#30340;&#37096;&#20998;&#29305;&#21270;</span>
eval<span class="sy1">&lt;</span>C<span class="sy1">&lt;</span><span class="nu0">17</span><span class="sy1">&gt;&gt;</span> eC<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;C &#22312;&#37096;&#20998;&#29305;&#21270;&#20013;&#19981;&#21305;&#37197; TT&#65292;&#22240;&#20026; TT &#30340;&#39318;&#20010;&#24418;&#21442;&#26159;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;</span>
<span class="co1">// &#32780; 17 &#19981;&#25351;&#21517;&#31867;&#22411;</span>
eval<span class="sy1">&lt;</span>D<span class="sy1">&lt;</span><span class="kw4">int</span>, <span class="nu0">17</span><span class="sy1">&gt;&gt;</span> eD<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;D &#22312;&#37096;&#20998;&#29305;&#21270;&#20013;&#19981;&#21305;&#37197; TT&#65292;</span>
<span class="co1">// &#22240;&#20026; TT &#30340;&#31532;&#20108;&#24418;&#21442;&#26159;&#31867;&#22411;&#24418;&#21442;&#21253;&#65292;&#32780; 17 &#19981;&#25351;&#21517;&#31867;&#22411;</span>
eval<span class="sy1">&lt;</span>E<span class="sy1">&lt;</span><span class="kw4">int</span>, <span class="kw4">float</span><span class="sy1">&gt;&gt;</span> eE<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;E &#22312;&#37096;&#20998;&#29305;&#21270;&#20013;&#19981;&#21305;&#37197; TT</span>
<span class="co1">// &#22240;&#20026; E &#30340;&#31532;&#19977;&#65288;&#40664;&#35748;&#65289;&#24418;&#21442;&#26159;&#38750;&#31867;&#22411;&#24418;&#21442;</span></pre></div>
</div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T<span class="sy1">&gt;</span> <span class="kw1">class</span> A <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> T, <span class="kw1">class</span> U <span class="sy1">=</span> T<span class="sy1">&gt;</span> <span class="kw1">class</span> B <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span> ...<span class="me1">Types</span><span class="sy1">&gt;</span> <span class="kw1">class</span> C <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span><span class="sy1">&gt;</span> <span class="kw1">class</span> P<span class="sy1">&gt;</span> <span class="kw1">class</span> X <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span>
X<span class="sy1">&lt;</span>A<span class="sy1">&gt;</span> xa<span class="sy4">;</span> <span class="co1">// OK</span>
X<span class="sy1">&lt;</span>B<span class="sy1">&gt;</span> xb<span class="sy4">;</span> <span class="co1">// C++17 &#22312; CWG 150 &#21518; OK</span>
<span class="co1">// &#26356;&#26089;&#26102;&#20026;&#38169;&#35823;&#65306;&#38750;&#20005;&#26684;&#21305;&#37197;</span>
X<span class="sy1">&lt;</span>C<span class="sy1">&gt;</span> xc<span class="sy4">;</span> <span class="co1">// C++17 &#22312; CWG 150 &#21518; OK</span>
<span class="co1">// &#26356;&#26089;&#26102;&#20026;&#38169;&#35823;&#65306;&#38750;&#20005;&#26684;&#21305;&#37197;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> ...<span class="sy1">&gt;</span> <span class="kw1">class</span> Q<span class="sy1">&gt;</span> <span class="kw1">class</span> Y <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span>
Y<span class="sy1">&lt;</span>A<span class="sy1">&gt;</span> ya<span class="sy4">;</span> <span class="co1">// OK</span>
Y<span class="sy1">&lt;</span>B<span class="sy1">&gt;</span> yb<span class="sy4">;</span> <span class="co1">// OK</span>
Y<span class="sy1">&lt;</span>C<span class="sy1">&gt;</span> yc<span class="sy4">;</span> <span class="co1">// OK</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">auto</span> n<span class="sy1">&gt;</span> <span class="kw1">class</span> D <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#27880;&#24847;&#65306;C++17</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> <span class="kw1">class</span> R<span class="sy1">&gt;</span> <span class="kw1">class</span> Z <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span>
Z<span class="sy1">&lt;</span>D<span class="sy1">&gt;</span> zd<span class="sy4">;</span> <span class="co1">// OK</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> <span class="kw1">struct</span> SI <span class="br0">{</span> <span class="coMULTI">/* ... */</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw1">template</span> <span class="sy1">&lt;</span><span class="kw4">auto</span><span class="sy1">&gt;</span> <span class="kw1">class</span><span class="sy1">&gt;</span> <span class="kw4">void</span> FA<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#27880;&#24847;&#65306;C++17</span>
FA<span class="sy1">&lt;</span>SI<span class="sy1">&gt;</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;</span></pre></div>
</div>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx17">
<td>
<p>&#27491;&#24335;&#26469;&#35828;&#65292;&#32473;&#23450;&#20197;&#19979;&#23545;&#20004;&#20010;&#20989;&#25968;&#27169;&#26495;&#30340;&#37325;&#20889;&#65292;&#26681;&#25454;<a href="cpp-language-function_template.html">&#20989;&#25968;&#27169;&#26495;</a>&#30340;&#20559;&#24207;&#35268;&#21017;&#65292;&#22914;&#26524;&#23545;&#24212;&#20110;&#27169;&#26495;&#27169;&#26495;&#24418;&#21442; <code>P</code> &#30340;&#20989;&#25968;&#27169;&#26495;&#65292;&#33267;&#23569;&#19982;&#23545;&#24212;&#20110;&#27169;&#26495;&#27169;&#26495;&#23454;&#21442; <code>A</code> &#30340;&#20989;&#25968;&#27169;&#26495;&#21516;&#26679;&#29305;&#27530;&#65292;&#21017; <code>P</code> &#33267;&#23569;&#19982; <code>A</code> &#21516;&#26679;&#29305;&#27530;&#12290;&#32473;&#23450;&#19968;&#20010;&#34394;&#35774;&#30340;&#31867;&#27169;&#26495; <code>X</code>&#65292;&#23427;&#25317;&#26377; <code>A</code> &#30340;&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;&#65288;&#21253;&#21547;&#40664;&#35748;&#23454;&#21442;&#65289;&#65306;</p>
<ul>
<li>&#20004;&#20010;&#20989;&#25968;&#27169;&#26495;&#21508;&#33258;&#20998;&#21035;&#25317;&#26377;&#19982; <code>P</code> &#25110; <code>A</code> &#30456;&#21516;&#30340;&#21508;&#20010;&#27169;&#26495;&#24418;&#21442;&#12290;</li>
<li>&#27599;&#20010;&#20989;&#25968;&#27169;&#26495;&#22343;&#25317;&#26377;&#21333;&#20010;&#20989;&#25968;&#24418;&#21442;&#65292;&#20854;&#31867;&#22411;&#26159;&#20197;&#23545;&#24212;&#20110;&#21508;&#33258;&#20989;&#25968;&#27169;&#26495;&#30340;&#27169;&#26495;&#24418;&#21442;&#30340;&#27169;&#26495;&#23454;&#21442;&#23545; <code>X</code> &#30340;&#29305;&#21270;&#65292;&#20854;&#20013;&#23545;&#20110;&#20989;&#25968;&#27169;&#26495;&#30340;&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;&#20013;&#30340;&#27599;&#20010;&#27169;&#26495;&#24418;&#21442; <code>PP</code>&#65292;&#26500;&#25104;&#19968;&#20010;&#23545;&#24212;&#30340;&#27169;&#26495;&#23454;&#21442; <code>AA</code>&#12290;&#33509; <code>PP</code> &#22768;&#26126;&#21442;&#25968;&#21253;&#65292;&#21017; <code>AA</code> &#26159;&#21253;&#23637;&#24320; <code>PP...</code>&#65307;&#21542;&#21017;&#65292;<code>AA</code> &#26159;&#26631;&#35782;&#34920;&#36798;&#24335; <code>PP</code>&#12290;</li>
</ul>
<p>&#33509;&#37325;&#20889;&#29983;&#25104;&#20102;&#38750;&#27861;&#31867;&#22411;&#65292;&#21017; <code>P</code> &#24182;&#38750;&#33267;&#23569;&#19982; <code>A</code> &#21516;&#26679;&#29305;&#27530;&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx17">(C++17 &#36215;)</span></td>
</tr>
</table>
<h4><span class="mw-headline" id=".E9.BB.98.E8.AE.A4.E6.A8.A1.E6.9D.BF.E5.AE.9E.E5.8F.82">&#40664;&#35748;&#27169;&#26495;&#23454;&#21442;</span></h4>
<p>&#40664;&#35748;&#27169;&#26495;&#23454;&#21442;&#22312;&#24418;&#21442;&#21015;&#34920;&#20013;&#20110; <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1">=</span></span></span> &#21495;&#20043;&#21518;&#25351;&#23450;&#12290;&#21487;&#20197;&#20026;&#20219;&#20309;&#31181;&#31867;&#30340;&#27169;&#26495;&#24418;&#21442;&#65288;&#31867;&#22411;&#12289;&#38750;&#31867;&#22411;&#25110;&#27169;&#26495;&#65289;&#25351;&#23450;&#40664;&#35748;&#23454;&#21442;&#65292;&#20294;&#19981;&#33021;&#23545;&#24418;&#21442;&#21253;&#25351;&#23450;&#12290;</p>
<p>&#33509;&#20026;&#20027;&#31867;&#27169;&#26495;<span class="t-rev-inl t-since-cxx14"><span>&#12289;&#20027;&#21464;&#37327;&#27169;&#26495;</span> <span><span class="t-mark-rev t-since-cxx14">(C++14 &#36215;)</span></span></span>&#25110;&#21035;&#21517;&#27169;&#29256;&#30340;&#27169;&#26495;&#24418;&#21442;&#25351;&#23450;&#40664;&#35748;&#23454;&#21442;&#65292;&#21017;&#20854;&#27599;&#20010;&#21518;&#32487;&#27169;&#26495;&#24418;&#21442;&#37117;&#24517;&#39035;&#26377;&#40664;&#35748;&#23454;&#21442;&#65292;&#20294;&#26368;&#21518;&#19968;&#20010;&#21487;&#20197;&#26159;&#27169;&#26495;&#24418;&#21442;&#21253;&#12290;&#22312;&#20989;&#25968;&#27169;&#26495;&#20013;&#65292;&#23545;&#36319;&#22312;&#40664;&#35748;&#23454;&#21442;&#20043;&#21518;&#30340;&#24418;&#21442;&#27809;&#26377;&#38480;&#21046;&#65292;&#32780;&#20165;&#24403;&#31867;&#22411;&#24418;&#21442;&#20855;&#26377;&#40664;&#35748;&#23454;&#21442;&#65292;&#25110;&#21487;&#20174;&#20989;&#25968;&#23454;&#21442;&#25512;&#23548;&#26102;&#65292;&#25165;&#21487;&#36319;&#22312;&#24418;&#21442;&#21253;&#20043;&#21518;&#12290;</p>
<p>&#20197;&#19979;&#24773;&#20917;&#19981;&#20801;&#35768;&#40664;&#35748;&#24418;&#21442;</p>
<ul>
<li>&#22312;<a href="cpp-language-class_template.html">&#31867;&#27169;&#26495;</a>&#30340;&#25104;&#21592;&#30340;&#31867;&#22806;&#23450;&#20041;&#20013;&#65288;&#24517;&#39035;&#22312;&#31867;&#20307;&#20869;&#30340;&#22768;&#26126;&#20013;&#25552;&#20379;&#23427;&#20204;&#65289;&#12290;&#27880;&#24847;&#38750;&#27169;&#26495;&#31867;&#30340;<a href="cpp-language-member_template.html">&#25104;&#21592;&#27169;&#26495;</a>&#21487;&#20197;&#22312;&#20854;&#31867;&#22806;&#23450;&#20041;&#20013;&#20351;&#29992;&#40664;&#35748;&#24418;&#21442;&#65288;&#35265; <a rel="nofollow" class="external text" href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53856">GCC &#28431;&#27934; 53856</a>&#65289;</li>
<li>&#22312;<a href="cpp-language-friend.html#.E6.A8.A1.E6.9D.BF.E5.8F.8B.E5.85.83">&#21451;&#20803;&#31867;&#27169;&#26495;</a>&#22768;&#26126;&#20013;</li>
</ul>
<table class="t-rev-begin">
<tr class="t-rev t-until-cxx11">
<td>
<ul>
<li>&#22312;&#20219;&#20309;<a href="cpp-language-function_template.html">&#20989;&#25968;&#27169;&#26495;</a>&#22768;&#26126;&#25110;&#23450;&#20041;&#20013;</li>
</ul>
</td>
<td><span class="t-mark-rev t-until-cxx11">(C++11 &#21069;)</span></td>
</tr>
</table>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx11">
<td>
<p>&#22312;&#21451;&#20803;&#20989;&#25968;&#27169;&#26495;&#30340;&#22768;&#26126;&#19978;&#65292;&#20165;&#24403;&#22768;&#26126;&#26159;&#23450;&#20041;&#65292;&#19988;&#27492;&#32763;&#35793;&#21333;&#20803;&#19981;&#20986;&#29616;&#27492;&#20989;&#25968;&#30340;&#20854;&#20182;&#22768;&#26126;&#26102;&#65292;&#25165;&#20801;&#35768;&#40664;&#35748;&#27169;&#26495;&#23454;&#21442;&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
</table>
<p>&#21508;&#20010;&#22768;&#26126;&#21644;&#23450;&#20041;&#20013;&#25152;&#20986;&#29616;&#30340;&#40664;&#35748;&#27169;&#26495;&#23454;&#21442;&#65292;&#20197;&#31867;&#20284;&#40664;&#35748;&#20989;&#25968;&#23454;&#21442;&#30340;&#26041;&#24335;&#21512;&#24182;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T1, <span class="kw1">typename</span> T2 <span class="sy1">=</span> <span class="kw4">int</span><span class="sy1">&gt;</span> <span class="kw1">class</span> A<span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T1 <span class="sy1">=</span> <span class="kw4">int</span>, <span class="kw1">typename</span> T2<span class="sy1">&gt;</span> <span class="kw1">class</span> A<span class="sy4">;</span>
<span class="co1">// &#22914;&#19978;&#19982;&#22914;&#19979;&#30456;&#21516;&#65306;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T1 <span class="sy1">=</span> <span class="kw4">int</span>, <span class="kw1">typename</span> T2 <span class="sy1">=</span> <span class="kw4">int</span><span class="sy1">&gt;</span> <span class="kw1">class</span> A<span class="sy4">;</span></pre></div>
</div>
<p>&#20294;&#22312;&#21516;&#19968;&#20316;&#29992;&#22495;&#20013;&#19981;&#33021;&#20004;&#27425;&#20026;&#21516;&#19968;&#24418;&#21442;&#25351;&#23450;&#40664;&#35748;&#23454;&#21442;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T <span class="sy1">=</span> <span class="kw4">int</span><span class="sy1">&gt;</span> <span class="kw1">class</span> X<span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T <span class="sy1">=</span> <span class="kw4">int</span><span class="sy1">&gt;</span> <span class="kw1">class</span> X <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;</span></pre></div>
</div>
<p>&#27169;&#26495;&#27169;&#26495;&#24418;&#21442;&#30340;&#27169;&#26495;&#24418;&#21442;&#21015;&#34920;&#21487;&#25317;&#26377;&#20854;&#33258;&#24049;&#30340;&#40664;&#35748;&#23454;&#21442;&#65292;&#23427;&#20165;&#22312;&#27169;&#26495;&#27169;&#26495;&#23454;&#21442;&#33258;&#36523;&#22788;&#20110;&#20316;&#29992;&#22495;&#20013;&#26102;&#26377;&#25928;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co1">// &#31867;&#27169;&#26495;&#65292;&#24102;&#26377;&#40664;&#35748;&#23454;&#21442;&#30340;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T <span class="sy1">=</span> <span class="kw4">float</span><span class="sy1">&gt;</span> <span class="kw1">struct</span> B <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// &#27169;&#26495;&#27169;&#26495;&#24418;&#21442; T &#26377;&#24418;&#21442;&#21015;&#34920;&#65292;</span>
<span class="co1">// &#23427;&#30001;&#19968;&#20010;&#24102;&#40664;&#35748;&#23454;&#21442;&#30340;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;&#32452;&#25104;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> <span class="sy1">=</span> <span class="kw4">float</span><span class="sy1">&gt;</span> <span class="kw1">typename</span> T<span class="sy1">&gt;</span> <span class="kw1">struct</span> A
<span class="br0">{</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// &#31867;&#20307;&#22806;&#30340;&#25104;&#21592;&#20989;&#25968;&#27169;&#26495;&#23450;&#20041;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> TT<span class="sy1">&gt;</span> <span class="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw4">void</span> A<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">f</span><span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
T<span class="sy1">&lt;&gt;</span> t<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;TT &#22312;&#20316;&#29992;&#22495;&#20013;&#26080;&#40664;&#35748;&#23454;&#21442;</span>
<span class="br0">}</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> TT <span class="sy1">=</span> <span class="kw4">char</span><span class="sy1">&gt;</span> <span class="kw1">class</span> T<span class="sy1">&gt;</span>
<span class="kw4">void</span> A<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">g</span><span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
T<span class="sy1">&lt;&gt;</span> t<span class="sy4">;</span> <span class="co1">// ok&#65306;t &#20026; T&lt;char&gt;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#40664;&#35748;&#27169;&#26495;&#24418;&#21442;&#20013;&#25152;&#29992;&#30340;&#21517;&#23383;&#30340;<a href="cpp-language-access.html">&#25104;&#21592;&#35775;&#38382;</a>&#65292;&#22312;&#22768;&#26126;&#20013;&#65292;&#32780;&#38750;&#22312;&#20351;&#29992;&#28857;&#26816;&#26597;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">class</span> B <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T<span class="sy1">&gt;</span> <span class="kw1">class</span> C
<span class="br0">{</span>
<span class="kw1">protected</span><span class="sy4">:</span>
<span class="kw1">typedef</span> T TT<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> U, <span class="kw1">typename</span> V <span class="sy1">=</span> <span class="kw1">typename</span> U<span class="sy4">::</span><span class="me2">TT</span><span class="sy1">&gt;</span> <span class="kw1">class</span> D<span class="sy4">:</span> <span class="kw1">public</span> U <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
D<span class="sy1">&lt;</span>C<span class="sy1">&lt;</span>B<span class="sy1">&gt;&gt;</span><span class="sy2">*</span> d<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;C::TT &#20026;&#21463;&#20445;&#25252;</span></pre></div>
</div>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx14">
<td>
<p>&#40664;&#35748;&#27169;&#26495;&#23454;&#21442;&#22312;&#38656;&#35201;&#35813;&#40664;&#35748;&#23454;&#21442;&#30340;&#20540;&#26102;&#34987;&#38544;&#24335;&#23454;&#20363;&#21270;&#65292;&#38500;&#38750;&#27169;&#26495;&#29992;&#20110;&#25351;&#21517;&#20989;&#25968;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">typename</span> T, <span class="kw1">typename</span> U <span class="sy1">=</span> <span class="kw4">int</span><span class="sy1">&gt;</span> <span class="kw1">struct</span> S <span class="br0">{</span> <span class="br0">}</span><span class="sy4">;</span>
S<span class="sy1">&lt;</span><span class="kw4">bool</span><span class="sy1">&gt;</span><span class="sy2">*</span> p<span class="sy4">;</span> <span class="co1">// &#40664;&#35748;&#27169;&#26495;&#23454;&#21442; U &#22312;&#27492;&#28857;&#23454;&#20363;&#21270;</span>
<span class="co1">// p &#30340;&#31867;&#22411;&#26159; S&lt;bool, int&gt;*</span></pre></div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx14">(C++14 &#36215;)</span></td>
</tr>
</table>
<h4><span class="mw-headline" id=".E6.A8.A1.E6.9D.BF.E5.AE.9E.E5.8F.82.E7.AD.89.E4.BB.B7.E6.80.A7">&#27169;&#26495;&#23454;&#21442;&#31561;&#20215;&#24615;</span></h4>
<p>&#27169;&#26495;&#23454;&#21442;&#31561;&#20215;&#24615;&#29992;&#20110;&#30830;&#23450;&#20108;&#20010;<a href="cpp-language-templates.html#.E6.A8.A1.E6.9D.BF.E6.A0.87.E8.AF.86">&#27169;&#26495;&#26631;&#35782;</a>&#26159;&#21542;&#30456;&#21516;&#12290;</p>
<p>&#20108;&#20010;&#20540;&#20026;<i>&#27169;&#26495;&#23454;&#21442;&#31561;&#20215;</i>&#65292;&#33509;&#23427;&#20204;&#25317;&#26377;&#30456;&#21516;&#31867;&#22411;&#19988;</p>
<ul>
<li>&#23427;&#20204;&#25317;&#26377;&#25972;&#25968;&#25110;&#26522;&#20030;&#31867;&#22411;&#19988;&#20854;&#20540;&#30456;&#21516;</li>
<li>&#25110;&#23427;&#20204;&#25317;&#26377;&#25351;&#38024;&#31867;&#22411;&#19988;&#23427;&#20204;&#25317;&#26377;&#21516;&#19968;&#25351;&#38024;&#20540;</li>
<li>&#25110;&#23427;&#20204;&#25317;&#26377;&#25104;&#21592;&#25351;&#38024;&#31867;&#22411;&#19988;&#23427;&#20204;&#25351;&#20195;&#21516;&#19968;&#31867;&#25104;&#21592;&#25110;&#22343;&#20026;&#31354;&#25104;&#21592;&#25351;&#38024;&#20540;</li>
<li>&#25110;&#23427;&#20204;&#25317;&#26377;&#24038;&#20540;&#24341;&#29992;&#31867;&#22411;&#19988;&#23427;&#20204;&#25351;&#20195;&#21516;&#19968;&#23545;&#35937;&#25110;&#20989;&#25968;</li>
</ul>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx11">
<td>
<ul>
<li>&#25110;&#23427;&#20204;&#25317;&#26377; <code>std::nullptr_t</code> &#31867;&#22411;</li>
</ul>
</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
</table>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx20">
<td>
<ul>
<li>&#25110;&#23427;&#20204;&#25317;&#26377;&#28014;&#28857;&#31867;&#22411;&#19988;&#20854;&#20540;&#31561;&#21516;</li>
<li>&#25110;&#23427;&#20204;&#25317;&#26377;&#25968;&#32452;&#31867;&#22411;&#65288;&#27492;&#24773;&#20917;&#19979;&#25968;&#32452;&#24517;&#39035;&#26159;&#26576;&#31867;/&#32852;&#21512;&#20307;&#30340;&#25104;&#21592;&#23545;&#35937;&#65289;&#19988;&#20854;&#23545;&#24212;&#20803;&#32032;&#27169;&#26495;&#23454;&#21442;&#31561;&#20215;</li>
<li>&#25110;&#23427;&#20204;&#25317;&#26377;&#32852;&#21512;&#20307;&#31867;&#22411;&#19988;&#23427;&#20204;&#22343;&#26080;&#27963;&#36291;&#25104;&#21592;&#65292;&#25110;&#23427;&#20204;&#25317;&#26377;&#30456;&#21516;&#30340;&#27963;&#36291;&#25104;&#21592;&#19988;&#20854;&#27963;&#36291;&#25104;&#21592;&#27169;&#26495;&#23454;&#21442;&#31561;&#20215;</li>
<li>&#25110;&#33509;&#23427;&#20204;&#25317;&#26377;&#38750;&#32852;&#21512;&#31867;&#31867;&#22411;&#19988;&#20854;&#23545;&#24212;&#30452;&#25509;&#23376;&#23545;&#35937;&#21644;&#24341;&#29992;&#25104;&#21592;&#27169;&#26495;&#23454;&#21442;&#31561;&#20215;</li>
</ul>
</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
</table>
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">&#31034;&#20363;</span></h3>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="co1">// &#31616;&#21333;&#30340;&#38750;&#31867;&#22411;&#27169;&#26495;&#24418;&#21442;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">int</span> N<span class="sy1">&gt;</span>
<span class="kw1">struct</span> S <span class="br0">{</span> <span class="kw4">int</span> a<span class="br0">[</span>N<span class="br0">]</span><span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span><span class="sy1">&gt;</span>
<span class="kw1">struct</span> S2 <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// &#22797;&#26434;&#30340;&#38750;&#31867;&#22411;&#24418;&#21442;&#30340;&#20363;&#23376;</span>
<span class="kw1">template</span>
<span class="sy1">&lt;</span>
<span class="kw4">char</span> c, <span class="co1">// &#25972;&#22411;&#31867;&#22411;</span>
<span class="kw4">int</span> <span class="br0">(</span><span class="sy3">&amp;</span>ra<span class="br0">)</span><span class="br0">[</span><span class="nu0">5</span><span class="br0">]</span>, <span class="co1">// &#21040;&#65288;&#25968;&#32452;&#31867;&#22411;&#65289;&#23545;&#35937;&#30340;&#24038;&#20540;&#24341;&#29992;</span>
<span class="kw4">int</span> <span class="br0">(</span><span class="sy2">*</span>pf<span class="br0">)</span><span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span>, <span class="co1">// &#20989;&#25968;&#25351;&#38024;</span>
<span class="kw4">int</span> <span class="br0">(</span>S<span class="sy1">&lt;</span><span class="nu0">10</span><span class="sy1">&gt;</span><span class="sy4">::</span><span class="sy2">*</span>a<span class="br0">)</span><span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span> <span class="co1">// &#25351;&#21521;&#65288;int[10] &#31867;&#22411;&#30340;&#65289;&#25104;&#21592;&#23545;&#35937;&#30340;&#25351;&#38024;</span>
<span class="sy1">&gt;</span> <span class="kw1">struct</span> Complicated
<span class="br0">{</span>
<span class="co1">// &#35843;&#29992;&#32534;&#35793;&#26102;&#25152;&#36873;&#25321;&#30340;&#20989;&#25968;</span>
<span class="co1">// &#24182;&#22312;&#32534;&#35793;&#26102;&#23558;&#20854;&#32467;&#26524;&#23384;&#20648;&#20110;&#25968;&#32452;&#20013;</span>
<span class="kw4">void</span> foo<span class="br0">(</span><span class="kw4">char</span> base<span class="br0">)</span>
<span class="br0">{</span>
ra<span class="br0">[</span><span class="nu0">4</span><span class="br0">]</span> <span class="sy1">=</span> pf<span class="br0">(</span>c <span class="sy2">-</span> base<span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
S2<span class="sy1">&lt;</span><span class="st0">&quot;fail&quot;</span><span class="sy1">&gt;</span> s2<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#19981;&#33021;&#29992;&#23383;&#31526;&#20018;&#23383;&#38754;&#37327;</span>
<span class="kw4">char</span> okay<span class="br0">[</span><span class="br0">]</span> <span class="sy1">=</span> <span class="st0">&quot;okay&quot;</span><span class="sy4">;</span> <span class="co1">// &#26377;&#36830;&#25509;&#30340;&#38745;&#24577;&#23545;&#35937;</span>
S2<span class="sy1">&lt;</span> <span class="sy3">&amp;</span>okay<span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy1">&gt;</span> s2<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#25968;&#32452;&#20803;&#32032;&#26080;&#36830;&#25509;</span>
S2<span class="sy1">&lt;</span>okay<span class="sy1">&gt;</span> s2<span class="sy4">;</span> <span class="co1">// &#33021;&#29992;</span>
<span class="kw4">int</span> a<span class="br0">[</span><span class="nu0">5</span><span class="br0">]</span><span class="sy4">;</span>
<span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">int</span> n<span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> n<span class="sy4">;</span> <span class="br0">}</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
S<span class="sy1">&lt;</span><span class="nu0">10</span><span class="sy1">&gt;</span> s<span class="sy4">;</span> <span class="co1">// s.a &#26159; 10 &#20010; int &#30340;&#25968;&#32452;</span>
s.<span class="me1">a</span><span class="br0">[</span><span class="nu0">9</span><span class="br0">]</span> <span class="sy1">=</span> <span class="nu0">4</span><span class="sy4">;</span>
Complicated<span class="sy1">&lt;</span><span class="st0">&#39;2&#39;</span>, a, f, <span class="sy3">&amp;</span>S<span class="sy1">&lt;</span><span class="nu0">10</span><span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">a</span><span class="sy1">&gt;</span> c<span class="sy4">;</span>
c.<span class="me1">foo</span><span class="br0">(</span><span class="st0">&#39;0&#39;</span><span class="br0">)</span><span class="sy4">;</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> s.<span class="me1">a</span><span class="br0">[</span><span class="nu0">9</span><span class="br0">]</span> <span class="sy1">&lt;&lt;</span> a<span class="br0">[</span><span class="nu0">4</span><span class="br0">]</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&#39;<span class="es1">\n</span>&#39;</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">42</pre></div>
</div>
</div>
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style="">
<tr>
<td class="mbox-empty-cell"></td>
<td class="mbox-text" style="">&#26412;&#33410;&#26410;&#23436;&#25104;<br />
&#21407;&#22240;&#65306;&#26356;&#22810;&#31034;&#20363;</td>
</tr>
</table>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>