Boost C++ Libraries: Ticket #1315: iterator_adaptor does not work with incomplete Value types https://svn.boost.org/trac10/ticket/1315 <p> boost::iterator_adaptor doesn't work when the associated Value type is incomplete, at least in MSVC++ 8.0 (my hunch is that the problem is general). The following </p> <pre class="wiki">#include &lt;boost/iterator/iterator_adaptor.hpp&gt; template&lt;typename T&gt; struct my_iterator: boost::iterator_adaptor&lt;my_iterator&lt;T&gt;,T*&gt; { }; struct foo { my_iterator&lt;foo&gt; it; }; int main(){} </pre><p> results in: </p> <pre class="wiki">...\boost\type_traits\is_pod.hpp(34) : error C2139: 'foo' : an undefined class is not allowed as an argument to compiler intrinsic type trait '__is_pod' ...\sandbox.cpp(10) : see declaration of 'foo' ...\type_traits\is_pod.hpp(128) : see reference to class template instantiation 'boost::detail::is_pod_impl&lt;T&gt;' being compiled [...] ...\boost\iterator\iterator_facade.hpp(652) : see reference to class templateinstantiation 'boost::detail::operator_brackets_result&lt;Iterator,Value,Reference&gt;' being compiled with [ Iterator=my_iterator&lt;foo&gt;, Value=foo, Reference=foo &amp; ] [...] </pre><p> Although this is probably not a bug strictly speaking, it would be fine if iterator_adaptor could be made to work with incomplete Value types, just as the canonical model for iterators, Value*, does. </p> en-us Boost C++ Libraries /htdocs/site/boost.png https://svn.boost.org/trac10/ticket/1315 Trac 1.4.3 Laurent Rineau <Laurent.Rineau__boost@…> Thu, 24 Apr 2008 14:36:22 GMT <link>https://svn.boost.org/trac10/ticket/1315#comment:1 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/1315#comment:1</guid> <description> <p> I encounter this bug with a code example a bit more tricky: </p> <pre class="wiki">#include &lt;boost/iterator/iterator_facade.hpp&gt; template &lt;class V&gt; struct Iterator : public boost::iterator_facade&lt;Iterator&lt;V&gt;, V, std::bidirectional_iterator_tag &gt; { friend class boost::iterator_core_access; bool equal(Iterator other) const { return true; } V&amp; dereference() const { V ref; return ref; } void increment() {} void decrement() {} }; template &lt; class T &gt; struct Vertex_base { typedef typename T::Face_iterator Face_iterator; Face_iterator _f; }; template &lt; typename T&gt; struct Face_base { typedef typename T::Vertex_iterator Vertex_iterator; Vertex_iterator V; }; struct Triangulation { typedef Vertex_base&lt;Triangulation&gt; Vertex; typedef Face_base&lt;Triangulation&gt; Face; typedef Iterator&lt;Face&gt; Face_iterator; typedef Iterator&lt;Vertex&gt; Vertex_iterator; Vertex_iterator v; }; int main() { Triangulation t; return 0; } </pre><p> g++-4.1.2 and g++-4.3.0 do compile the code above, with boost-1.34.1 or with boost trunk (revision 44750), but MSVC++ 8.0 does not (same error diagnostic as the bug submitter): </p> <pre class="wiki">cd c:/applis/downloads/boost_1_35_0/ cl.exe -I. facade.cpp Microsoft (R) C/C++ Optimizing Compiler Version 14.00.50727.42 for x64 Copyright (C) Microsoft Corporation.  All rights reserved. facade.cpp facade.cpp(42) : error C2148: total size of array must not exceed 0x7fffffff bytes         .\boost/type_traits/is_class.hpp(76) : see reference to class template instantiation 'Face_base&lt;T&gt;' being compiled         with         [             T=Triangulation         ]         .\boost/type_traits/is_class.hpp(121) : see reference to class template instantiation 'boost::detail::is_class_impl&lt;T&gt;' being compiled         with         [             T=Triangulation::Face         ]         .\boost/type_traits/is_enum.hpp(43) : see reference to class template instantiation 'boost::is_class&lt;T&gt;' being compiled         with         [             T=Triangulation::Face         ]         .\boost/type_traits/is_enum.hpp(134) : see reference to class template instantiation 'boost::detail::is_class_or_union&lt;T&gt;' being compiled         with         [             T=Triangulation::Face         ]         .\boost/type_traits/is_enum.hpp(166) : see reference to class template instantiation 'boost::detail::is_enum_impl&lt;T&gt;' being compiled         with         [             T=Triangulation::Face         ]         .\boost/type_traits/is_scalar.hpp(29) : see reference to class template instantiation 'boost::is_enum&lt;T&gt;' being compiled         with         [             T=Triangulation::Face         ]         .\boost/type_traits/is_scalar.hpp(49) : see reference to class template instantiation 'boost::detail::is_scalar_impl&lt;T&gt;' being compiled         with         [             T=Triangulation::Face         ]         .\boost/type_traits/is_pod.hpp(34) : see reference to class template instantiation 'boost::is_scalar&lt;T&gt;' being compiled         with         [             T=Triangulation::Face         ]         .\boost/type_traits/is_pod.hpp(128) : see reference to class template instantiation 'boost::detail::is_pod_impl&lt;T&gt;' being compiled         with         [             T=Triangulation::Face         ]         c:\applis\downloads\boost_1_35_0\boost/mpl/aux_/preprocessed/plain/and.hpp(51) : see reference to class template instantiation 'boost::is_POD&lt;T&gt;' being compiled         with         [             T=Triangulation::Face         ]         .\boost/mpl/not.hpp(41) : see reference to class template instantiation 'boost::mpl::and_&lt;T1,T2&gt;' being compiled         with         [             T1=boost::is_POD&lt;Triangulation::Face&gt;,             T2=boost::detail::iterator_writability_disabled&lt;Triangulation::Face,Face_base&lt;Triangulation&gt; &amp;&gt;         ]         .\boost/iterator/iterator_facade.hpp(382) : see reference to class template instantiation 'boost::mpl::not_&lt;T&gt;' being compiled         with         [             T=boost::mpl::and_&lt;boost::is_POD&lt;Triangulation::Face&gt;,boost::detail::iterator_writability_disabled&lt;Triangulation::Face,Face_base&lt;Triangulation&gt; &amp;&gt;&gt;         ]         .\boost/mpl/if.hpp(63) : see reference to class template instantiation 'boost::detail::use_operator_brackets_proxy&lt;ValueType,Reference&gt;' being compiled         with         [             ValueType=Triangulation::Face,             Reference=Face_base&lt;Triangulation&gt; &amp;         ]         .\boost/iterator/iterator_facade.hpp(391) : see reference to class template instantiation 'boost::mpl::if_&lt;T1,T2,T3&gt;' being compiled         with         [             T1=boost::detail::use_operator_brackets_proxy&lt;Triangulation::Face,Face_base&lt;Triangulation&gt; &amp;&gt;,             T2=boost::detail::operator_brackets_proxy&lt;Iterator&lt;Triangulation::Face&gt;&gt;,             T3=Triangulation::Face         ]         .\boost/iterator/iterator_facade.hpp(652) : see reference to class template instantiation 'boost::detail::operator_brackets_result&lt;Iterator,Value,Reference&gt;' being compiled         with         [             Iterator=Iterator&lt;Triangulation::Face&gt;,             Value=Triangulation::Face,             Reference=Face_base&lt;Triangulation&gt; &amp;         ]         facade.cpp(8) : see reference to class template instantiation 'boost::iterator_facade&lt;Derived,Value,CategoryOrTraversal&gt;' being compiled         with         [             Derived=Iterator&lt;Triangulation::Face&gt;,             Value=Triangulation::Face,             CategoryOrTraversal=std::bidirectional_iterator_tag         ]         facade.cpp(32) : see reference to class template instantiation 'Iterator&lt;V&gt;' being compiled         with         [             V=Triangulation::Face         ]         .\boost/type_traits/is_class.hpp(76) : see reference to class template instantiation 'Vertex_base&lt;T&gt;' being compiled         with         [             T=Triangulation         ]         .\boost/type_traits/is_class.hpp(121) : see reference to class template instantiation 'boost::detail::is_class_impl&lt;T&gt;' being compiled         with         [             T=Triangulation::Vertex         ]         .\boost/type_traits/is_enum.hpp(43) : see reference to class template instantiation 'boost::is_class&lt;T&gt;' being compiled         with         [             T=Triangulation::Vertex         ]         .\boost/type_traits/is_enum.hpp(134) : see reference to class template instantiation 'boost::detail::is_class_or_union&lt;T&gt;' being compiled         with         [             T=Triangulation::Vertex         ]         .\boost/type_traits/is_enum.hpp(166) : see reference to class template instantiation 'boost::detail::is_enum_impl&lt;T&gt;' being compiled         with         [             T=Triangulation::Vertex         ]         .\boost/type_traits/is_scalar.hpp(29) : see reference to class template instantiation 'boost::is_enum&lt;T&gt;' being compiled         with         [             T=Triangulation::Vertex         ]         .\boost/type_traits/is_scalar.hpp(49) : see reference to class template instantiation 'boost::detail::is_scalar_impl&lt;T&gt;' being compiled         with         [             T=Triangulation::Vertex         ]         .\boost/type_traits/is_pod.hpp(34) : see reference to class template instantiation 'boost::is_scalar&lt;T&gt;' being compiled         with         [             T=Triangulation::Vertex         ]         .\boost/type_traits/is_pod.hpp(128) : see reference to class template instantiation 'boost::detail::is_pod_impl&lt;T&gt;' being compiled         with         [             T=Triangulation::Vertex         ]         c:\applis\downloads\boost_1_35_0\boost/mpl/aux_/preprocessed/plain/and.hpp(51) : see reference to class template instantiation 'boost::is_POD&lt;T&gt;' being compiled         with         [             T=Triangulation::Vertex         ]         .\boost/mpl/not.hpp(41) : see reference to class template instantiation 'boost::mpl::and_&lt;T1,T2&gt;' being compiled         with         [             T1=boost::is_POD&lt;Triangulation::Vertex&gt;,             T2=boost::detail::iterator_writability_disabled&lt;Triangulation::Vertex,Vertex_base&lt;Triangulation&gt; &amp;&gt;         ]         .\boost/iterator/iterator_facade.hpp(382) : see reference to class template instantiation 'boost::mpl::not_&lt;T&gt;' being compiled         with         [             T=boost::mpl::and_&lt;boost::is_POD&lt;Triangulation::Vertex&gt;,boost::detail::iterator_writability_disabled&lt;Triangulation::Vertex,Vertex_base&lt;Triangulation&gt; &amp;&gt;&gt;         ]         .\boost/mpl/if.hpp(63) : see reference to class template instantiation 'boost::detail::use_operator_brackets_proxy&lt;ValueType,Reference&gt;' being compiled         with         [             ValueType=Triangulation::Vertex,             Reference=Vertex_base&lt;Triangulation&gt; &amp;         ]         .\boost/iterator/iterator_facade.hpp(391) : see reference to class template instantiation 'boost::mpl::if_&lt;T1,T2,T3&gt;' being compiled         with         [             T1=boost::detail::use_operator_brackets_proxy&lt;Triangulation::Vertex,Vertex_base&lt;Triangulation&gt; &amp;&gt;,             T2=boost::detail::operator_brackets_proxy&lt;Iterator&lt;Triangulation::Vertex&gt;&gt;,             T3=Triangulation::Vertex         ]         .\boost/iterator/iterator_facade.hpp(652) : see reference to class template instantiation 'boost::detail::operator_brackets_result&lt;Iterator,Value,Reference&gt;' being compiled         with         [             Iterator=Iterator&lt;Triangulation::Vertex&gt;,             Value=Triangulation::Vertex,             Reference=Vertex_base&lt;Triangulation&gt; &amp;         ]         facade.cpp(8) : see reference to class template instantiation 'boost::iterator_facade&lt;Derived,Value,CategoryOrTraversal&gt;' being compiled         with         [             Derived=Iterator&lt;Triangulation::Vertex&gt;,             Value=Triangulation::Vertex,             CategoryOrTraversal=std::bidirectional_iterator_tag         ]         facade.cpp(54) : see reference to class template instantiation 'Iterator&lt;V&gt;' being compiled         with         [             V=Triangulation::Vertex         ] facade.cpp(42) : error C2079: 'Face_base&lt;T&gt;::V' uses undefined struct 'Iterator&lt;V&gt;'         with         [             T=Triangulation         ]         and         [             V=Triangulation::Vertex         ] Compilation exited abnormally with code 2 at Thu Apr 24 13:19:24 </pre> </description> <category>Ticket</category> </item> <item> <author>Laurent Rineau <Laurent.Rineau__boost@…></author> <pubDate>Thu, 24 Apr 2008 14:43:34 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/1315#comment:2 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/1315#comment:2</guid> <description> <p> As far as I have understood, when <code>iterator_facade&lt;Derived,Value,Category,...&gt;</code> is instanciated, the type <code>Value</code> is required to be complete because of the following member function prototype: </p> <pre class="wiki">typename detail::operator_brackets_result&lt;Derived,Value,reference&gt;::type operator[](difference_type n) const </pre><p> which triggers the instanciation of <code>use_operator_brackets_proxy&lt;Value,Reference&gt;</code> (in the same file), which triggers the instanciation of <code>is_POD&lt;Value&gt;</code>, which requires a complete type. </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Dave Abrahams</dc:creator> <pubDate>Thu, 24 Apr 2008 17:51:47 GMT</pubDate> <title>status changed https://svn.boost.org/trac10/ticket/1315#comment:3 https://svn.boost.org/trac10/ticket/1315#comment:3 <ul> <li><strong>status</strong> <span class="trac-field-old">new</span> → <span class="trac-field-new">assigned</span> </li> </ul> <p> I think your analysis is correct, but my question to you is: why should this be considered a bug? </p> <p> I can only think of one way around it, and that's to templatize <code>operator[]</code>. </p> Ticket Joaquín M López Muñoz Thu, 24 Apr 2008 19:11:08 GMT <link>https://svn.boost.org/trac10/ticket/1315#comment:4 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/1315#comment:4</guid> <description> <blockquote class="citation"> <p> I think your analysis is correct, but my question to you is: why should this be considered a bug? </p> </blockquote> <p> Because T*, which is the type upon which iterators are modelled, can be instantiated on incomplete types. I've checked section 24.1 of the standard and this requirement does not seem to be explicitly stated, but IMHO it's a nice feature to have, given that 24.1.2 recognized iterators as an abstraction of pointers. FWIW, I first encountered the problem in the context of a real situation. </p> <blockquote class="citation"> <p> I can only think of one way around it, and that's to templatize operator[] </p> </blockquote> <p> Correct. Please see </p> <p> <a class="ext-link" href="http://lists.boost.org/Archives/boost/2007/10/128738.php"><span class="icon">​</span>http://lists.boost.org/Archives/boost/2007/10/128738.php</a> </p> <p> where I propose a possible implementation of the workaround. </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Dave Abrahams</dc:creator> <pubDate>Thu, 24 Apr 2008 23:59:28 GMT</pubDate> <title>owner, status changed https://svn.boost.org/trac10/ticket/1315#comment:5 https://svn.boost.org/trac10/ticket/1315#comment:5 <ul> <li><strong>owner</strong> changed from <span class="trac-author">Dave Abrahams</span> to <span class="trac-author">Thomas Witt</span> </li> <li><strong>status</strong> <span class="trac-field-old">assigned</span> → <span class="trac-field-new">new</span> </li> </ul> <p> Replying to <a class="ticket" href="https://svn.boost.org/trac10/ticket/1315#comment:4" title="Comment 4">joaquin</a>: </p> <blockquote class="citation"> <blockquote class="citation"> <p> I think your analysis is correct, but my question to you is: why should this be considered a bug? </p> </blockquote> <p> Because T*, which is the type upon which iterators are modelled, can be instantiated on incomplete types. </p> </blockquote> <p> Technically, T* can't be instantiated, since it isn't a template. </p> <blockquote class="citation"> <p> I've checked section 24.1 of the standard and this requirement does not seem to be explicitly stated, but IMHO it's a nice feature to have, given that 24.1.2 recognized iterators as an abstraction of pointers. FWIW, I first encountered the problem in the context of a real situation. </p> </blockquote> <p> Exactly, a nice feature to have. I think this is a feature request... which is why you've labelled it as such. OK, objection withdrawn ;-) </p> <blockquote class="citation"> <blockquote class="citation"> <p> I can only think of one way around it, and that's to templatize operator[] </p> </blockquote> <p> Correct. Please see </p> <p> <a class="ext-link" href="http://lists.boost.org/Archives/boost/2007/10/128738.php"><span class="icon">​</span>http://lists.boost.org/Archives/boost/2007/10/128738.php</a> </p> <p> where I propose a possible implementation of the workaround. </p> </blockquote> <p> Thomas: I guess since operator[] has to be a member function, we wouldn't gain anything by enable-if'ing it? </p> Ticket Laurent Rineau <Laurent.Rineau__boost@…> Fri, 25 Apr 2008 08:24:57 GMT <link>https://svn.boost.org/trac10/ticket/1315#comment:6 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/1315#comment:6</guid> <description> <p> Replying to <a class="ticket" href="https://svn.boost.org/trac10/ticket/1315#comment:3" title="Comment 3">dave</a>: </p> <blockquote class="citation"> <p> I think your analysis is correct, but my question to you is: why should this be considered a bug? </p> </blockquote> <p> It is more a <em>feature request</em> than a bug. In a software of ours, <a class="ext-link" href="http://www.cgal.org/"><span class="icon">​</span>CGAL</a>, we would like to use the features of <code>iterator_facade</code>, in a scenario alike the one I posted in <a class="ticket" href="https://svn.boost.org/trac10/ticket/1315#comment:1" title="Comment 1">comment 1</a>. It currently works with GNU/g++ (versions 4.1.2 and 4.3.0 at least), even if I do not know why, but not with MSVC++ 8. </p> </description> <category>Ticket</category> </item> <item> <author>Duncan Exon Smith <duncanphilipnorman@…></author> <pubDate>Wed, 13 Oct 2010 22:43:20 GMT</pubDate> <title>cc set https://svn.boost.org/trac10/ticket/1315#comment:7 https://svn.boost.org/trac10/ticket/1315#comment:7 <ul> <li><strong>cc</strong> <span class="trac-author">duncanphilipnorman@…</span> added </li> </ul> <p> Replying to <a class="ticket" href="https://svn.boost.org/trac10/ticket/1315#comment:6" title="Comment 6">Laurent Rineau &lt;Laurent.Rineau__boost@…&gt;</a>: </p> <blockquote class="citation"> <p> Replying to <a class="ticket" href="https://svn.boost.org/trac10/ticket/1315#comment:3" title="Comment 3">dave</a>: </p> <blockquote class="citation"> <p> I think your analysis is correct, but my question to you is: why should this be considered a bug? </p> </blockquote> <p> It is more a <em>feature request</em> than a bug. In a software of ours, <a class="ext-link" href="http://www.cgal.org/"><span class="icon">​</span>CGAL</a>, we would like to use the features of <code>iterator_facade</code>, in a scenario alike the one I posted in <a class="ticket" href="https://svn.boost.org/trac10/ticket/1315#comment:1" title="Comment 1">comment 1</a>. It currently works with GNU/g++ (versions 4.1.2 and 4.3.0 at least), even if I do not know why, but not with MSVC++ 8. </p> </blockquote> <p> This feature worked in GCC only because of a bug prior to v4.4 (e.g., you could use abstract types in v4.3.4). However, this bug -- to do with the intrinsics <code>__is_abstract</code> and <code>__is_pod</code> -- was fixed: </p> <blockquote> <p> <a class="ext-link" href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39475"><span class="icon">​</span>http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39475</a> </p> </blockquote> <p> GCC v4.4.3 now gives the same as MSVC. In particular, <code>iterator_facade&lt;&gt;</code> cannot be used to wrap pointers to abstract types any longer. With a large codebase that accidentally relied on this misbehaviour, we cannot upgrade past GCC v4.3 without this feature. </p> <p> Does anyone know if <a class="ext-link" href="http://lists.boost.org/Archives/boost/2007/10/128738.php"><span class="icon">​</span>the workaround above</a> causes any problems? </p> Ticket Duncan Exon Smith <duncanphilipnorman@…> Wed, 13 Oct 2010 22:51:20 GMT <link>https://svn.boost.org/trac10/ticket/1315#comment:8 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/1315#comment:8</guid> <description> <p> Replying to <a class="ticket" href="https://svn.boost.org/trac10/ticket/1315#comment:7" title="Comment 7">Duncan Exon Smith &lt;duncanphilipnorman@…&gt;</a>: </p> <blockquote class="citation"> <p> This feature worked in GCC only because of a bug prior to v4.4 (e.g., you could use abstract types in v4.3.4). However, this bug -- to do with the intrinsics <code>__is_abstract</code> and <code>__is_pod</code> -- was fixed: </p> <blockquote> <p> <a class="ext-link" href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39475"><span class="icon">​</span>http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39475</a> </p> </blockquote> <p> GCC v4.4.3 now gives the same as MSVC. In particular, <code>iterator_facade&lt;&gt;</code> cannot be used to wrap pointers to abstract types any longer. With a large codebase that accidentally relied on this misbehaviour, we cannot upgrade past GCC v4.3 without this feature. </p> </blockquote> <p> BTW, in case anyone else is searching for it, there's a similar problem with <code>boost::iterator_range&lt;&gt;</code>, from Boost.<a class="missing wiki">RangeEx</a>, since it uses <code>is_abstract&lt;&gt;</code>. Incomplete types cannot be used there, either. </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Dave Abrahams</dc:creator> <pubDate>Wed, 21 Nov 2012 22:30:59 GMT</pubDate> <title>owner changed https://svn.boost.org/trac10/ticket/1315#comment:9 https://svn.boost.org/trac10/ticket/1315#comment:9 <ul> <li><strong>owner</strong> changed from <span class="trac-author">Thomas Witt</span> to <span class="trac-author">jeffrey.hellrung</span> </li> </ul> Ticket Duncan Exon Smith <duncanphilipnorman@…> Thu, 22 Nov 2012 15:52:09 GMT <link>https://svn.boost.org/trac10/ticket/1315#comment:10 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/1315#comment:10</guid> <description> <p> Since I saw this changed owners, I should maybe give some feedback. We've been using something similar to <a class="ext-link" href="http://lists.boost.org/Archives/boost/2007/10/128738.php"><span class="icon">​</span>the workaround above</a> for a couple of years, and it has worked well. </p> <ul><li>There are a few places in the file that need to be templated on <code>Difference</code>. </li><li>We've applied similar patches to parts of Boost.Range. </li></ul><p> E.g., our version of the relevant code from the linked patch is: </p> <div class="wiki-code"><div class="code"><pre> <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">DummyDifference</span><span class="o">&gt;</span> <span class="k">typename</span> <span class="n">boost</span><span class="o">::</span><span class="n">lazy_enable_if</span> <span class="o">&lt;</span> <span class="n">boost</span><span class="o">::</span><span class="n">is_convertible</span><span class="o">&lt;</span><span class="n">DummyDifference</span><span class="p">,</span> <span class="n">difference_type</span><span class="o">&gt;</span> <span class="p">,</span> <span class="k">typename</span> <span class="n">boost</span><span class="o">::</span><span class="n">detail</span><span class="o">::</span><span class="n">operator_brackets_result</span><span class="o">&lt;</span><span class="n">Derived</span><span class="p">,</span><span class="n">Value</span><span class="p">,</span><span class="n">reference</span><span class="p">,</span><span class="n">DummyDifference</span><span class="o">&gt;::</span><span class="n">type</span> <span class="o">&gt;::</span><span class="n">type</span> <span class="k">operator</span><span class="p">[](</span><span class="n">DummyDifference</span> <span class="n">n_</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span> <span class="n">difference_type</span> <span class="n">n</span><span class="p">(</span><span class="n">n_</span><span class="p">);</span> </pre></div></div> </description> <category>Ticket</category> </item> </channel> </rss>