<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[typedef aus Basisklasse nicht erkannt - Brett vorm Kopf?]]></title><description><![CDATA[<p>Hallo zusammen,<br />
bei mir spuckt der Compiler Zähne, weil er einen typedef aus einer template-Basisklasse nicht findet. Vielleicht mache ich was falsch und seh den Wald vor lauter Bäumen nicht.<br />
folgender Code:</p>
<pre><code class="language-cpp">#include &lt;iterator&gt;
#include &lt;boost/operators.hpp&gt;
#include &lt;boost/type_traits/remove_pointer.hpp&gt;
// bei std::vector&lt;T*&gt;::iterator als iter_t ergibt sich value_t = T
template&lt;class iter_t, class value_t = typename boost::remove_pointer&lt;
                              typename std::iterator_traits&lt;iter_t&gt;::value_type
                            &gt;::type &gt; 
class deref_iterator 
   // standard-typedefs und boilerplate fuer operatoren liefert boost.Operators
   : public boost::random_access_iterator_helper&lt;deref_iterator&lt;iter_t, value_t&gt;, value_t, typename std::iterator_traits&lt;iter_t&gt;::difference_type&gt;
{
public:
  reference operator*() const
  {/* ... */ }

/* ... */
};
</code></pre>
<p>Der Clou ist der random_access_iterator_helper. Per base-Class chaining erbt das Ganze über mehrere Generationen von<br />
<code>boost::iterator&lt;std::random_access_iterator_tag, V, D, P, R&gt;</code> und damit von <code>std::iterator&lt;std::random_access_iterator_tag, V, D, P, R&gt;</code> , mit R = value_t&amp; wie oben.<br />
Die Typen in der Hierarchie sind allesamt structs, die Vererbung des typedefs sollte also public bis in meine Klasse runterreichen.</p>
<p>MSVC schmeißt mir aber folgenden Fehler und steigt danach aus:</p>
<pre><code>error C2143: syntax error : missing ';' before '*'
</code></pre>
<p>, erkennt also reference nicht als typ.</p>
<p>Ich hab auchs chon versucht, die basisklasse zu typedeffen und dann über den typedef qualifiziert den Typ anzugeben als <code>base_t::reference operator*() const</code> , dann meckert er, dass reference kein typ ist.</p>
<p>Was stört ihn?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290880/typedef-aus-basisklasse-nicht-erkannt-brett-vorm-kopf</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 04:43:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290880.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Aug 2011 08:25:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to typedef aus Basisklasse nicht erkannt - Brett vorm Kopf? on Fri, 05 Aug 2011 08:25:51 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
bei mir spuckt der Compiler Zähne, weil er einen typedef aus einer template-Basisklasse nicht findet. Vielleicht mache ich was falsch und seh den Wald vor lauter Bäumen nicht.<br />
folgender Code:</p>
<pre><code class="language-cpp">#include &lt;iterator&gt;
#include &lt;boost/operators.hpp&gt;
#include &lt;boost/type_traits/remove_pointer.hpp&gt;
// bei std::vector&lt;T*&gt;::iterator als iter_t ergibt sich value_t = T
template&lt;class iter_t, class value_t = typename boost::remove_pointer&lt;
                              typename std::iterator_traits&lt;iter_t&gt;::value_type
                            &gt;::type &gt; 
class deref_iterator 
   // standard-typedefs und boilerplate fuer operatoren liefert boost.Operators
   : public boost::random_access_iterator_helper&lt;deref_iterator&lt;iter_t, value_t&gt;, value_t, typename std::iterator_traits&lt;iter_t&gt;::difference_type&gt;
{
public:
  reference operator*() const
  {/* ... */ }

/* ... */
};
</code></pre>
<p>Der Clou ist der random_access_iterator_helper. Per base-Class chaining erbt das Ganze über mehrere Generationen von<br />
<code>boost::iterator&lt;std::random_access_iterator_tag, V, D, P, R&gt;</code> und damit von <code>std::iterator&lt;std::random_access_iterator_tag, V, D, P, R&gt;</code> , mit R = value_t&amp; wie oben.<br />
Die Typen in der Hierarchie sind allesamt structs, die Vererbung des typedefs sollte also public bis in meine Klasse runterreichen.</p>
<p>MSVC schmeißt mir aber folgenden Fehler und steigt danach aus:</p>
<pre><code>error C2143: syntax error : missing ';' before '*'
</code></pre>
<p>, erkennt also reference nicht als typ.</p>
<p>Ich hab auchs chon versucht, die basisklasse zu typedeffen und dann über den typedef qualifiziert den Typ anzugeben als <code>base_t::reference operator*() const</code> , dann meckert er, dass reference kein typ ist.</p>
<p>Was stört ihn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102144</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 05 Aug 2011 08:25:51 GMT</pubDate></item><item><title><![CDATA[Reply to typedef aus Basisklasse nicht erkannt - Brett vorm Kopf? on Fri, 05 Aug 2011 08:47:18 GMT]]></title><description><![CDATA[<p>Mit dem gezeigten Code kann ich das nicht beurteilen, aber hast Du mal an <code>boost.iterators</code> gedacht? Ich könnte mir sogar denken, dass <code>indirect_iterator</code> schon das bereitstellt, was Du Dir da bauen willst (vermute ich aufgrund des Namens Deiner Klasse).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102171</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 05 Aug 2011 08:47:18 GMT</pubDate></item><item><title><![CDATA[Reply to typedef aus Basisklasse nicht erkannt - Brett vorm Kopf? on Fri, 05 Aug 2011 08:47:06 GMT]]></title><description><![CDATA[<p>Wenn ich random_access_iterator_helper über <a href="http://www.tena-sda.org/doc/5.2.1/boost/d6/d66/operators_8hpp-source.html" rel="nofollow">http://www.tena-sda.org/doc/5.2.1/boost/d6/d66/operators_8hpp-source.html</a> zurückverfolge, sehe ich nicht das es irgendwann in boost::iterator landet und somit reference bekommt. Vielleicht übersehe ich auch nur etwas.</p>
<p>Abhilfe ist dann wohl nur ein eigenes:</p>
<pre><code class="language-cpp">typedef value_t&amp; reference;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2102172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102172</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 05 Aug 2011 08:47:06 GMT</pubDate></item><item><title><![CDATA[Reply to typedef aus Basisklasse nicht erkannt - Brett vorm Kopf? on Fri, 05 Aug 2011 09:30:09 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>Vielleicht übersehe ich auch nur etwas.</p>
</blockquote>
<p>Es erbt von <code>random_access_iterable&lt;T, P, D, R, boost::iterator&lt;std::random_access_iterator_tag, V, D, P, R&gt; &gt;</code></p>
<p><a href="http://www.tena-sda.org/doc/5.2.1/boost/da/d1b/structboost_1_1random__access__iteratable.html" rel="nofollow">http://www.tena-sda.org/doc/5.2.1/boost/da/d1b/structboost_1_1random__access__iteratable.html</a></p>
<p>Das letzte Argument, also boost::iterator, wird in der Hierarchie immer weiter nach oben gereicht, die oberste Klasse erbt dann davon.</p>
<p>ich hab die typedefs jetzt manuell eingebaut (wovon mich der iterator_helper ja eigentlich befreien sollte).</p>
<p>Tachyon: ja. Genau das Ding hab ich nachgebaut. *kopf-&gt;tisch*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102197</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 05 Aug 2011 09:30:09 GMT</pubDate></item><item><title><![CDATA[Reply to typedef aus Basisklasse nicht erkannt - Brett vorm Kopf? on Fri, 05 Aug 2011 09:47:02 GMT]]></title><description><![CDATA[<p>Zur ursprünglichen Frage: reference ist als Rückgabewert deiner Funktion kein Dependent Name. Siehe <a href="http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18" rel="nofollow">http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18</a> zur Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102207</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 05 Aug 2011 09:47:02 GMT</pubDate></item><item><title><![CDATA[Reply to typedef aus Basisklasse nicht erkannt - Brett vorm Kopf? on Fri, 05 Aug 2011 09:52:07 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Zur ursprünglichen Frage: reference ist als Rückgabewert deiner Funktion kein Dependent Name. Siehe <a href="http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18" rel="nofollow">http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18</a> zur Lösung.</p>
</blockquote>
<p>Ich wusste doch, das da noch irgendwas in diesem Zusammenhang war, aber pumuckl hatte das ja eigentlich mit seinem base typedef schon versucht. Vielleicht hat aber nur das typename gefehlt ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102211</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 05 Aug 2011 09:52:07 GMT</pubDate></item><item><title><![CDATA[Reply to typedef aus Basisklasse nicht erkannt - Brett vorm Kopf? on Fri, 05 Aug 2011 10:07:10 GMT]]></title><description><![CDATA[<p>meh. Das typename hat IIRC auch nichts gebracht. vermutlich weil das reference nicht in der dependent base sondern in der 5. oder 10. abhängigen Basisklasse ganz oben in der Hierarchie hängt -.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102216</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 05 Aug 2011 10:07:10 GMT</pubDate></item><item><title><![CDATA[Reply to typedef aus Basisklasse nicht erkannt - Brett vorm Kopf? on Fri, 05 Aug 2011 10:25:53 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>meh. Das typename hat IIRC auch nichts gebracht. vermutlich weil das reference nicht in der dependent base sondern in der 5. oder 10. abhängigen Basisklasse ganz oben in der Hierarchie hängt -.-</p>
</blockquote>
<p>Komisch, das sollte eigentlich durchgehen: <a href="http://ideone.com/JPc2b" rel="nofollow">http://ideone.com/JPc2b</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102226</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 05 Aug 2011 10:25:53 GMT</pubDate></item><item><title><![CDATA[Reply to typedef aus Basisklasse nicht erkannt - Brett vorm Kopf? on Fri, 05 Aug 2011 10:39:25 GMT]]></title><description><![CDATA[<p>So einen Iterator gibt es übrigens schon:<br />
<a href="http://www.boost.org/doc/libs/1_47_0/libs/iterator/doc/indirect_iterator.html" rel="nofollow">http://www.boost.org/doc/libs/1_47_0/libs/iterator/doc/indirect_iterator.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102231</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 05 Aug 2011 10:39:25 GMT</pubDate></item><item><title><![CDATA[Reply to typedef aus Basisklasse nicht erkannt - Brett vorm Kopf? on Fri, 05 Aug 2011 10:55:56 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>meh. Das typename hat IIRC auch nichts gebracht. vermutlich weil das reference nicht in der dependent base sondern in der 5. oder 10. abhängigen Basisklasse ganz oben in der Hierarchie hängt -.-</p>
</blockquote>
<p>Komisch, das sollte eigentlich durchgehen: <a href="http://ideone.com/JPc2b" rel="nofollow">http://ideone.com/JPc2b</a></p>
</blockquote>
<p>ja, da müsste ich nur durchschauen, wie das template am Ende der Klassenhierarchie dann aussieht. Du hast zum qualifizieren ja die oberste Klasse der Hierarchie angegeben, nicht die direkte Basisklasse.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>So einen Iterator gibt es übrigens schon:<br />
<a href="http://www.boost.org/doc/libs/1_47_0/libs/iterator/doc/indirect_iterator.html" rel="nofollow">http://www.boost.org/doc/libs/1_47_0/libs/iterator/doc/indirect_iterator.html</a></p>
</blockquote>
<p>So einen Kommentar gibts auch schon (oben von Tachyon) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102238</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 05 Aug 2011 10:55:56 GMT</pubDate></item></channel></rss>