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

141 lines
19 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>&#27880;&#20837;&#31867;&#21517;</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_injected-class-name skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">&#27880;&#20837;&#31867;&#21517;</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">
<p>&#27880;&#20837;&#31867;&#21517;&#26159;&#22312;&#31867;&#30340;&#20316;&#29992;&#22495;&#20869;&#35813;&#31867;&#33258;&#36523;&#30340;&#21517;&#23383;&#12290;</p>
<p>&#31867;&#27169;&#26495;&#20013;&#65292;&#27880;&#20837;&#31867;&#21517;&#33021;&#29992;&#20316;&#25351;&#20195;&#24403;&#21069;&#27169;&#26495;&#30340;&#27169;&#26495;&#21517;&#65292;&#25110;&#25351;&#20195;&#24403;&#21069;&#23454;&#20363;&#21270;&#30340;&#31867;&#21517;&#12290;</p>
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">&#35299;&#37322;</span></h3>
<p>&#22312;&#31867;&#20316;&#29992;&#22495;&#20013;&#65292;&#24403;&#21069;&#31867;&#30340;&#21517;&#23383;&#34987;&#24403;&#20570;&#23427;&#22914;&#21516;&#26159;&#19968;&#20010;&#20844;&#24320;&#25104;&#21592;&#21517;&#19968;&#26679;&#65307;&#36825;&#34987;&#31216;&#20026;<i>&#27880;&#20837;&#31867;&#21517;&#65288;injected-class-name&#65289;</i>&#12290;&#35813;&#21517;&#23383;&#30340;&#22768;&#26126;&#28857;&#32039;&#36319;&#31867;&#23450;&#20041;&#30340;&#24320;&#33457;&#25324;&#21495;&#20043;&#21518;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw4">int</span> X<span class="sy4">;</span>
<span class="kw1">struct</span> X <span class="br0">{</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
X<span class="sy2">*</span> p<span class="sy4">;</span> <span class="co1">// OK&#65306;X &#25351;&#20195;&#27880;&#20837;&#31867;&#21517;</span>
<span class="sy4">::</span><span class="me2">X</span><span class="sy2">*</span> q<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#21517;&#31216;&#26597;&#25214;&#25214;&#21040;&#21464;&#37327;&#21517;&#65292;&#23427;&#38544;&#34255;&#32467;&#26500;&#20307;&#21517;</span>
<span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<p>&#19982;&#20854;&#20182;&#25104;&#21592;&#31867;&#20284;&#65292;&#27880;&#20837;&#31867;&#21517;&#20250;&#34987;&#32487;&#25215;&#12290;&#22312;&#31169;&#26377;&#25110;&#21463;&#20445;&#25252;&#32487;&#25215;&#30340;&#22330;&#21512;&#65292;&#26576;&#20010;&#38388;&#25509;&#22522;&#31867;&#30340;&#27880;&#20837;&#31867;&#21517;&#22312;&#27966;&#29983;&#31867;&#20013;&#26368;&#21518;&#21487;&#33021;&#20250;&#26080;&#27861;&#35775;&#38382;&#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="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> B <span class="sy4">:</span> <span class="kw1">private</span> A <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> C <span class="sy4">:</span> <span class="kw1">public</span> B <span class="br0">{</span>
A<span class="sy2">*</span> p<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#27880;&#20837;&#31867;&#21517; A &#19981;&#21487;&#35775;&#38382;</span>
<span class="sy4">::</span><span class="me2">A</span><span class="sy2">*</span> q<span class="sy4">;</span> <span class="co1">// OK&#65306;&#19981;&#20351;&#29992;&#27880;&#20837;&#31867;&#21517;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<h3><span class="mw-headline" id=".E5.9C.A8.E7.B1.BB.E6.A8.A1.E6.9D.BF.E4.B8.AD">&#22312;&#31867;&#27169;&#26495;&#20013;</span></h3>
<p>&#19982;&#20854;&#20182;&#31867;&#30456;&#20284;&#65292;&#31867;&#27169;&#26495;&#20063;&#25317;&#26377;&#27880;&#20837;&#31867;&#21517;&#12290;&#23427;&#30340;&#27880;&#20837;&#31867;&#21517;&#21487;&#20197;&#34987;&#29992;&#20316;&#27169;&#26495;&#21517;&#25110;&#31867;&#22411;&#21517;&#12290;</p>
<p>&#19979;&#21015;&#24773;&#20917;&#19979;&#65292;&#27880;&#20837;&#31867;&#21517;&#34987;&#24403;&#20570;&#31867;&#27169;&#26495;&#33258;&#36523;&#30340;&#27169;&#26495;&#21517;&#65306;</p>
<ul>
<li>&#23427;&#21518;&#38754;&#36319;&#30528; <code><b>&lt;</b></code></li>
<li>&#23427;&#34987;&#29992;&#20316;&#23545;&#24212;&#26576;&#20010;&#27169;&#26495;&#27169;&#26495;&#24418;&#21442;&#30340;&#27169;&#26495;&#23454;&#21442;</li>
<li>&#23427;&#26159;&#26576;&#20010;&#21451;&#20803;&#31867;&#27169;&#26495;&#22768;&#26126;&#30340;&#35814;&#36848;&#31867;&#22411;&#35828;&#26126;&#31526;&#20013;&#30340;&#26368;&#21518;&#26631;&#35782;&#31526;&#12290;</li>
</ul>
<p>&#21542;&#21017;&#65292;&#23427;&#34987;&#24403;&#20570;&#31867;&#22411;&#21517;&#65292;&#24182;&#31561;&#20215;&#20110;&#27169;&#26495;&#21517;&#21518;&#38543;&#29615;&#32469;&#20110; <code><b>&lt;&gt;</b></code> &#20013;&#30340;&#35813;&#31867;&#27169;&#26495;&#30340;&#21508;&#20010;&#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">template</span> <span class="sy1">&lt;</span><span class="kw1">class</span>, <span class="kw1">class</span><span class="sy1">&gt;</span> <span class="kw1">class</span><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">class</span> T1, <span class="kw1">class</span> T2<span class="sy1">&gt;</span>
<span class="kw1">struct</span> X <span class="br0">{</span>
X<span class="sy1">&lt;</span>T1, T2<span class="sy1">&gt;</span><span class="sy2">*</span> p<span class="sy4">;</span> <span class="co1">// OK&#65306;X &#34987;&#24403;&#20570;&#27169;&#26495;&#21517;</span>
<span class="kw1">using</span> a <span class="sy1">=</span> A<span class="sy1">&lt;</span>X<span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// OK&#65306;X &#34987;&#24403;&#20570;&#27169;&#26495;&#21517;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span> U1, <span class="kw1">class</span> U2<span class="sy1">&gt;</span>
<span class="kw1">friend</span> <span class="kw1">class</span> X<span class="sy4">;</span> <span class="co1">// OK&#65306;X &#34987;&#24403;&#20570;&#27169;&#26495;&#21517;</span>
X<span class="sy2">*</span> q<span class="sy4">;</span> <span class="co1">// OK&#65306;X &#34987;&#24403;&#20570;&#31867;&#22411;&#21517;&#65292;&#31561;&#20215;&#20110; X&lt;T1, T2&gt;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<p>&#22312;&#31867;&#27169;&#26495;&#29305;&#21270;&#25110;&#37096;&#20998;&#29305;&#21270;&#30340;&#20316;&#29992;&#22495;&#20869;&#65292;&#24403;&#23558;&#27880;&#20837;&#31867;&#21517;&#29992;&#20316;&#31867;&#22411;&#21517;&#26102;&#65292;&#23427;&#31561;&#20215;&#20110;&#27169;&#26495;&#21517;&#21518;&#38543;&#29615;&#32469;&#20110; <code><b>&lt;&gt;</b></code> &#20013;&#30340;&#35813;&#31867;&#27169;&#26495;&#29305;&#21270;&#25110;&#37096;&#20998;&#29305;&#21270;&#30340;&#21508;&#20010;&#27169;&#26495;&#23454;&#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;&gt;</span>
<span class="kw1">struct</span> X<span class="sy1">&lt;</span><span class="kw4">void</span>, <span class="kw4">void</span><span class="sy1">&gt;</span> <span class="br0">{</span>
X<span class="sy2">*</span> p<span class="sy4">;</span> <span class="co1">// OK&#65306;X &#34987;&#24403;&#20570;&#31867;&#22411;&#21517;&#65292;&#31561;&#20215;&#20110; X&lt;void, void&gt;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span>, <span class="kw1">class</span><span class="sy1">&gt;</span>
<span class="kw1">friend</span> <span class="kw1">class</span> X<span class="sy4">;</span> <span class="co1">// OK&#65306;X &#34987;&#24403;&#20570;&#27169;&#26495;&#21517;&#65288;&#19982;&#22312;&#27169;&#26495;&#20013;&#30456;&#21516;&#65289;</span>
X<span class="sy1">&lt;</span><span class="kw4">void</span>, <span class="kw4">void</span><span class="sy1">&gt;</span><span class="sy2">*</span> q<span class="sy4">;</span> <span class="co1">// OK&#65306;X &#34987;&#24403;&#20570;&#27169;&#26495;&#21517;</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">struct</span> X<span class="sy1">&lt;</span><span class="kw4">char</span>, T<span class="sy1">&gt;</span> <span class="br0">{</span>
X<span class="sy2">*</span> p, q<span class="sy4">;</span> <span class="co1">// OK&#65306;X &#34987;&#24403;&#20570;&#31867;&#22411;&#21517;&#65292;&#31561;&#20215;&#20110; X&lt;char, T&gt;</span>
<span class="kw1">using</span> r <span class="sy1">=</span> X<span class="sy1">&lt;</span><span class="kw4">int</span>, <span class="kw4">int</span><span class="sy1">&gt;</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#21487;&#20197;&#29992;&#23427;&#25351;&#21517;&#21478;&#19968;&#29305;&#21270;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<p>&#21482;&#35201;&#22312;&#20316;&#29992;&#22495;&#20013;&#65292;&#31867;&#27169;&#26495;&#25110;&#31867;&#27169;&#26495;&#29305;&#21270;&#30340;&#27880;&#20837;&#31867;&#21517;&#23601;&#33021;&#34987;&#29992;&#20316;&#27169;&#26495;&#21517;&#25110;&#31867;&#22411;&#21517;&#20043;&#19968;&#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;&gt;</span> <span class="kw1">class</span> X<span class="sy1">&lt;</span><span class="kw4">int</span>, <span class="kw4">char</span><span class="sy1">&gt;</span> <span class="br0">{</span>
<span class="kw1">class</span> B <span class="br0">{</span>
X a<span class="sy4">;</span> <span class="co1">// &#34920;&#31034; X&lt;int, char&gt;</span>
<span class="kw1">template</span><span class="sy1">&lt;</span><span class="kw1">class</span>,<span class="kw1">class</span><span class="sy1">&gt;</span> <span class="kw1">friend</span> <span class="kw1">class</span> X<span class="sy4">;</span> <span class="co1">// &#34920;&#31034; ::X</span>
<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> T<span class="sy1">&gt;</span> <span class="kw1">struct</span> Base <span class="br0">{</span>
Base<span class="sy2">*</span> p<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> T<span class="sy1">&gt;</span> <span class="kw1">struct</span> Derived<span class="sy4">:</span> <span class="kw1">public</span> Base<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> <span class="br0">{</span>
<span class="kw1">typename</span> Derived<span class="sy4">::</span><span class="me2">Base</span><span class="sy2">*</span> p<span class="sy4">;</span> <span class="co1">// &#34920;&#31034; Derived::Base&lt;T&gt;</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">template</span><span class="sy1">&lt;</span><span class="kw1">class</span><span class="sy1">&gt;</span> <span class="kw1">class</span> U <span class="sy1">=</span> T<span class="sy4">::</span><span class="kw1">template</span> Base<span class="sy1">&gt;</span> <span class="kw1">struct</span> Third <span class="br0">{</span> <span class="br0">}</span><span class="sy4">;</span>
Third<span class="sy1">&lt;</span>Derived<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;&gt;</span> t<span class="sy4">;</span> <span class="co1">// OK&#65306;&#40664;&#35748;&#23454;&#21442;&#23558;&#27880;&#20837;&#31867;&#21517;&#29992;&#20316;&#27169;&#26495;</span></pre></div>
</div>
<p>&#25214;&#21040;&#27880;&#20837;&#31867;&#21517;&#30340;&#26597;&#25214;&#22312;&#26576;&#20123;&#24773;&#20917;&#19979;&#20250;&#23548;&#33268;&#27495;&#20041;&#65288;&#20363;&#22914;&#24403;&#22312;&#22810;&#20110;&#19968;&#20010;&#22522;&#31867;&#20013;&#25214;&#21040;&#23427;&#26102;&#65289;&#12290;&#22914;&#26524;&#25152;&#26377;&#25214;&#21040;&#30340;&#27880;&#20837;&#31867;&#21517;&#37117;&#25351;&#20195;&#21516;&#19968;&#31867;&#27169;&#26495;&#30340;&#29305;&#21270;&#65292;&#19988;&#35813;&#21517;&#23383;&#34987;&#29992;&#20316;&#27169;&#26495;&#21517;&#65292;&#37027;&#20040;&#27880;&#20837;&#31867;&#21517;&#25351;&#20195;&#31867;&#27169;&#26495;&#33258;&#36523;&#32780;&#38750;&#20854;&#29305;&#21270;&#65292;&#19988;&#27809;&#26377;&#27495;&#20041;&#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> Base <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">struct</span> Derived<span class="sy4">:</span> Base<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span>, Base<span class="sy1">&lt;</span><span class="kw4">char</span><span class="sy1">&gt;</span> <span class="br0">{</span>
<span class="kw1">typename</span> Derived<span class="sy4">::</span><span class="me2">Base</span> b<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#27495;&#20041;</span>
<span class="kw1">typename</span> Derived<span class="sy4">::</span><span class="me2">Base</span><span class="sy1">&lt;</span><span class="kw4">double</span><span class="sy1">&gt;</span> d<span class="sy4">;</span> <span class="co1">// OK</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<h3><span class="mw-headline" id=".E6.B3.A8.E5.85.A5.E7.B1.BB.E5.90.8D.E4.B8.8E.E6.9E.84.E9.80.A0.E5.87.BD.E6.95.B0">&#27880;&#20837;&#31867;&#21517;&#19982;&#26500;&#36896;&#20989;&#25968;</span></h3>
<p>&#26500;&#36896;&#20989;&#25968;&#27809;&#26377;&#21517;&#23383;&#65292;&#20294;&#22312;&#26500;&#36896;&#20989;&#25968;&#30340;&#22768;&#26126;&#19982;&#23450;&#20041;&#20013;&#65292;&#22806;&#22260;&#31867;&#30340;&#27880;&#20837;&#31867;&#21517;&#34987;&#35748;&#20026;&#26159;&#26500;&#36896;&#20989;&#25968;&#30340;&#21517;&#31216;&#12290;</p>
<p>&#22312;&#26377;&#38480;&#23450;&#30340;&#21517;&#23383; <code>C::D</code> &#20013;&#65292;&#22914;&#26524;</p>
<ul>
<li>&#21517;&#23383;&#26597;&#25214;&#19981;&#24573;&#30053;&#20989;&#25968;&#21517;&#65292;&#19988;</li>
<li>&#23545; <code>D</code> &#22312;&#31867; <code>C</code> &#30340;&#20316;&#29992;&#22495;&#20013;&#30340;&#26597;&#25214;&#25214;&#21040;&#20102;&#27880;&#20837;&#31867;&#21517;</li>
</ul>
<p>&#37027;&#20040;&#22987;&#32456;&#35748;&#20026;&#35813;&#38480;&#23450;&#21517;&#25351;&#21517; <code>C</code> &#30340;&#26500;&#36896;&#20989;&#25968;&#12290;&#36825;&#31181;&#21517;&#23383;&#21482;&#33021;&#29992;&#20110;&#26500;&#36896;&#20989;&#25968;&#30340;&#22768;&#26126;&#20013;&#65288;&#20363;&#22914;&#65292;&#22312;&#21451;&#20803;&#26500;&#36896;&#20989;&#25968;&#22768;&#26126;&#65292;&#26500;&#36896;&#20989;&#25968;&#27169;&#26495;&#29305;&#21270;&#65292;&#26500;&#36896;&#20989;&#25968;&#27169;&#26495;&#23454;&#20363;&#21270;&#65292;&#25110;&#26500;&#36896;&#20989;&#25968;&#23450;&#20041;&#20013;&#65289;<span class="t-rev-inl t-since-cxx11"><span>&#65292;&#25110;&#29992;&#20110;&#32487;&#25215;&#26500;&#36896;&#20989;&#25968;</span> <span><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></span></span>&#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>
A<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
A<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="kw1">class</span> T<span class="sy1">&gt;</span> A<span class="br0">(</span>T<span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">using</span> A_alias <span class="sy1">=</span> A<span class="sy4">;</span>
A<span class="sy4">::</span><span class="me2">A</span><span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span>
A_alias<span class="sy4">::</span><span class="me2">A</span><span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span>
<span class="kw1">template</span> A<span class="sy4">::</span><span class="me2">A</span><span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">struct</span> B <span class="sy4">:</span> A <span class="br0">{</span>
<span class="kw1">using</span> A_alias<span class="sy4">::</span><span class="me2">A</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
A<span class="sy4">::</span><span class="me2">A</span> a<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;A::A &#34987;&#35748;&#20026;&#25351;&#21517;&#26500;&#36896;&#20989;&#25968;&#65292;&#32780;&#38750;&#31867;&#22411;</span>
<span class="kw1">struct</span> A<span class="sy4">::</span><span class="me2">A</span> a2<span class="sy4">;</span> <span class="co1">// OK&#65306;&#19982; &#39;A a2;&#39; &#30456;&#21516;</span>
B<span class="sy4">::</span><span class="me2">A</span> b<span class="sy4">;</span> <span class="co1">// OK&#65306;&#19982; &#39;A b;&#39; &#30456;&#21516;</span></pre></div>
</div>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>