<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<TITLE>
    CWG Issue 588</TITLE>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<STYLE TYPE="text/css">
  INS { text-decoration:none; font-weight:bold; background-color:#A0FFA0 }
  .INS { text-decoration:none; background-color:#D0FFD0 }
  DEL { text-decoration:line-through; background-color:#FFA0A0 }
  .DEL { text-decoration:line-through; background-color: #FFD0D0 }
  @media (prefers-color-scheme: dark) {
    HTML { background-color:#202020; color:#f0f0f0; }
    A { color:#5bc0ff; }
    A:visited { color:#c6a8ff; }
    A:hover, a:focus { color:#afd7ff; }
    INS { background-color:#033a16; color:#aff5b4; }
    .INS { background-color: #033a16; }
    DEL { background-color:#67060c; color:#ffdcd7; }
    .DEL { background-color:#67060c; }
  }
  SPAN.cmnt { font-family:Times; font-style:italic }
</STYLE>
</HEAD>
<BODY>
<P><EM>This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21
  Core Issues List revision 118b.
  See http://www.open-std.org/jtc1/sc22/wg21/ for the official
  list.</EM></P>
<P>2025-09-28</P>
<HR>
<A NAME="588"></A><H4>588.
  
Searching dependent bases of classes local to function templates
</H4>
<B>Section: </B>13.8.3&#160; [<A href="https://wg21.link/temp.dep">temp.dep</A>]
 &#160;&#160;&#160;

 <B>Status: </B>CD2
 &#160;&#160;&#160;

 <B>Submitter: </B>James Widman
 &#160;&#160;&#160;

 <B>Date: </B>21 June 2006<BR>


<P>[Voted into the WP at the March, 2009 meeting.]</P>



<P>13.8.3 [<A href="https://wg21.link/temp.dep#3">temp.dep</A>] paragraph 3 reads,</P>

<BLOCKQUOTE>

In the definition of a class template or a member of a class template,
if a base class of the class template depends on
a <I>template-parameter</I>, the base class scope is not examined
during unqualified name lookup either at the point of definition of
the class template or member or during an instantiation of the class
template or member.

</BLOCKQUOTE>

<P>This wording applies only to definitions of class templates and
members of class templates.  That would make the following program
ill-formed (but it probably should be well-formed):</P>

<PRE>
    struct B{ void f(int); };

    template&lt;class T&gt; struct D: B { };

    template&lt;class T&gt; void g() {
       struct B{ void f(); };
       struct A: D&lt;T&gt; {
           B m;
       };
       A a;
       a.m.f(); //<SPAN CLASS="cmnt"> Presumably, we want </SPAN>::g()::B::f()<SPAN CLASS="cmnt">, not </SPAN>::B::f(int)
    }

    int main () {
       g&lt;int&gt;();
       return 0;
    }
</PRE>

<P>I suspect the wording should be something like</P>

<BLOCKQUOTE>

In the definition of a class template <INS>or a class defined
(directly or indirectly) within the scope of a class template or
function template</INS>, if a base class...

</BLOCKQUOTE>

<P>That should also include deeply nested classes in templates, local
classes of non-template member functions of member classes of class
templates, etc.</P>

<P><B>Proposed resolution (October, 2006):</B></P>

<P>Change 13.8.3 [<A href="https://wg21.link/temp.dep#3">temp.dep</A>] paragraph 3 as follows:</P>

<BLOCKQUOTE>

In the definition of a <INS>class or</INS> class template <DEL>or a member
of a class template</DEL>, if a base class <DEL>of the class template</DEL>
depends on a <I>template-parameter</I>, the base class scope is not
examined during unqualified name lookup either at the point of
definition of the class template or member or during an instantiation
of the class template or member.

</BLOCKQUOTE>

<BR><BR>
</BODY>
</HTML>
