<?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[Problem Streamoperator und Klassentemplate substruktur]]></title><description><![CDATA[<p>Hi,<br />
hoffe jemand kann mir einen Tip geben.</p>
<p>Ich habe ein Klassentemplate, das ein Typedef enthält, zu dem ich einen Streamoperator bereitstellen möchte.<br />
Leider matcht er den operator aus irgend welchen Gründen nicht und gibt mir immer den Fehler &quot;binary '&lt;&lt;': no operator found ...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;array&gt;

template &lt;int DIM&gt;
class Test
{
public:
  typedef std::array&lt;int, DIM&gt; A;
};

template&lt; int DIM&gt;
std::ostream&amp; operator&lt;&lt;( std::ostream&amp; str, const typename Test&lt;DIM&gt;::A&amp; rm )
{
  str &lt;&lt; rm.size();
  return str;
}

// [...]
Test&lt; 5&gt;::A a;
std::cout &lt;&lt; a;
// [...]
</code></pre>
<p>Compiler ist MSVC10</p>
<p>Hat jemand einen Tip?</p>
<p>Gruß<br />
Vlad</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307974/problem-streamoperator-und-klassentemplate-substruktur</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 08:08:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307974.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Sep 2012 07:57:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem Streamoperator und Klassentemplate substruktur on Tue, 11 Sep 2012 08:00:14 GMT]]></title><description><![CDATA[<p>Hi,<br />
hoffe jemand kann mir einen Tip geben.</p>
<p>Ich habe ein Klassentemplate, das ein Typedef enthält, zu dem ich einen Streamoperator bereitstellen möchte.<br />
Leider matcht er den operator aus irgend welchen Gründen nicht und gibt mir immer den Fehler &quot;binary '&lt;&lt;': no operator found ...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;array&gt;

template &lt;int DIM&gt;
class Test
{
public:
  typedef std::array&lt;int, DIM&gt; A;
};

template&lt; int DIM&gt;
std::ostream&amp; operator&lt;&lt;( std::ostream&amp; str, const typename Test&lt;DIM&gt;::A&amp; rm )
{
  str &lt;&lt; rm.size();
  return str;
}

// [...]
Test&lt; 5&gt;::A a;
std::cout &lt;&lt; a;
// [...]
</code></pre>
<p>Compiler ist MSVC10</p>
<p>Hat jemand einen Tip?</p>
<p>Gruß<br />
Vlad</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250160</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Tue, 11 Sep 2012 08:00:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Streamoperator und Klassentemplate substruktur on Tue, 11 Sep 2012 08:06:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">typename Test&lt;DIM&gt;::A
</code></pre>
<p>ist kein Kontext, in dem DIM deduziert werden könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250163</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 11 Sep 2012 08:06:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Streamoperator und Klassentemplate substruktur on Tue, 11 Sep 2012 08:21:32 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">typename Test&lt;DIM&gt;::A
</code></pre>
<p>ist kein Kontext, in dem DIM deduziert werden könnte.</p>
</blockquote>
<p>das heißt? was muss ich tun, damit es funktioniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250170</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Tue, 11 Sep 2012 08:21:32 GMT</pubDate></item><item><title><![CDATA[Reply to Problem Streamoperator und Klassentemplate substruktur on Tue, 11 Sep 2012 09:07:52 GMT]]></title><description><![CDATA[<p>vlad_tepesch schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">typename Test&lt;DIM&gt;::A
</code></pre>
<p>ist kein Kontext, in dem DIM deduziert werden könnte.</p>
</blockquote>
<p>das heißt?</p>
</blockquote>
<p>Um die aufzurufende Funktion zu bestimmen, muss der Compiler aus dem übergebenen Argument den passenden Templateparamter bestimmen (deduzieren). Das ist bei einem Bezeichner dieser Form grundsätzlich nicht möglich.<br />
z.B.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;array&gt;

template &lt;int DIM&gt;
class Test
{
public:
  typedef std::array&lt;int, DIM&gt; A;
};

template&lt; int DIM&gt;
std::ostream&amp; operator&lt;&lt;( std::ostream&amp; str, const typename Test&lt;DIM&gt;::A&amp; rm )
{
  str &lt;&lt; rm.size();
  return str;
}

template &lt;&gt;
class Test&lt;0&gt;
{
public:
  typedef std::array&lt;int, 5&gt; A;
};

// [...]
Test&lt; 5&gt;::A a;
std::cout &lt;&lt; a;  // DIM==5 oder DIM==0 ?
// [...]
</code></pre>
<p>(selbst wenn es Spezialisierung nicht gäbe, wäre eine solche Deduktion im allgemeinen Fall unmöglich).</p>
<p>vlad_tepesch schrieb:</p>
<blockquote>
<p>was muss ich tun, damit es funktioniert?</p>
</blockquote>
<p>Das kommt ein bisschen darauf an, was und warum du so etwas tun willst.<br />
Handelte es sich nicht um ein typedef sondern um einen in der Klasse definierten Typ, könnten Friendfunktionen genutzt werden, die per ADL gefunden werden.</p>
<p>Bei einem einfachen typedef ist der betreffende Typ dagegen in keiner Weise mit deinem Template assoziert. Dann bleibt wahrscheinlich nur die Verwendung eines sehr allgemeinen Templates, das mittels Prädikates dann geeignet eingeschränkt wird</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
typename std::enable_if&lt;is_Test_A&lt;T&gt;::value,std::ostream&gt;::type&amp; operator&lt;&lt;( std::ostream&amp; str, const T&amp; rm )
{
    const int DIM = get_dim&lt;T&gt;::value;
</code></pre>
<p>is_Test_A und get_dim müsstest du dann selbst schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250192</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 11 Sep 2012 09:07:52 GMT</pubDate></item></channel></rss>