<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<TITLE>
    CWG Issue 217</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="217"></A><H4>217.
  
Default arguments for non-template member functions of class templates
</H4>
<B>Section: </B>9.3.4.7&#160; [<A href="https://wg21.link/dcl.fct.default">dcl.fct.default</A>]
 &#160;&#160;&#160;

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

 <B>Submitter: </B>Martin Sebor
 &#160;&#160;&#160;

 <B>Date: </B>22 Mar 2000<BR>




<P>
According to 9.3.4.7 [<A href="https://wg21.link/dcl.fct.default">dcl.fct.default</A>] paragraphs 4 and 6,

<BLOCKQUOTE>

<P>For non-template functions, default arguments can be added in later
declarations of a function in the same scope.</P>

<P>The default arguments in a member function definition that appears
outside of the class definition are added to the set of default
arguments provided by the member function declaration in the class
definition.</P>

</BLOCKQUOTE>
</P>

<P>This would appear to allow the following example, in which a
default argument is added to a non-template member function of a class
template:</P>

<PRE>
    template &lt;class T&gt;
    struct S
    {
	void foo (int);
    };

    template &lt;class T&gt;
    void S&lt;T&gt;::foo (int = 0) { }
</PRE>

<P>
<U>John Spicer</U>:
The wording "non-template
functions" is somewhat unclear with respect to member functions of class
templates, but I know that this was intended to include them because it
originates from issue 3.13 of the template issues list that I maintained for
several years.</P>

<P>Having said that, the rationale for this restriction has since been made
obsolete, so this could (in theory) be changed in the standard if it is
problematic for users.</P>

<P>(See also <A HREF="205.html">issue 205</A>.)</P>

<P><B>Proposed resolution (10/00):</B></P>

<P>In 9.3.4.7 [<A href="https://wg21.link/dcl.fct.default#6">dcl.fct.default</A>] paragraph 6, replace</P>

<BLOCKQUOTE>

The default arguments in a member function definition that appears
outside of the class definition are added to the set of default
arguments provided by the member function declaration in the class
definition.

</BLOCKQUOTE>

<P>with</P>

<BLOCKQUOTE>

Except for member functions of class templates, the default arguments
in a member function definition that appears outside of the class
definition are added to the set of default arguments provided by the
member function declaration in the class definition.  Default
arguments for a member function of a class template must be specified
on the initial declaration of the member function within the class
template.

</BLOCKQUOTE>

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