<?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[Einlesen einer &#x27;inner struct&#x27; eines Templates von istream compiliert nicht]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe folgenden Code</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt; typename T &gt;
struct Foo {
    struct Inn {
        int m_x;
    };
    T m_y;
};

template&lt; typename T &gt;
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, typename Foo&lt; T &gt;::Inn&amp; i ) {
    int x;
    if( in &gt;&gt; x ) i.m_x = x;
    return in;
}

int main() {
    Foo&lt; int &gt;::Inn i;
    std::cin &gt;&gt; i;  // &lt;---- kompiliert nicht: 
       // no operator &quot;&gt;&gt;&quot; matches these operands
       //      operand types are: std::istream &gt;&gt; Foo&lt;int&gt;::Inn
    return 0;
}
</code></pre>
<p>Meine Compiler (VC7 Comeau) sind beide in der markierten Zeile der Meinung, dass es keinen operator&gt;&gt;( std::istream&amp; in, Foo&lt; int &gt;::Inn&amp; i ) gibt. Was mache ich falsch? Deklariere ich die Streaming-Funktion konkret mit einem int, statt als Template, so funkt's.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/126476/einlesen-einer-inner-struct-eines-templates-von-istream-compiliert-nicht</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 17:54:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/126476.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Nov 2005 12:40:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Einlesen einer &#x27;inner struct&#x27; eines Templates von istream compiliert nicht on Tue, 15 Nov 2005 12:40:12 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe folgenden Code</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt; typename T &gt;
struct Foo {
    struct Inn {
        int m_x;
    };
    T m_y;
};

template&lt; typename T &gt;
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, typename Foo&lt; T &gt;::Inn&amp; i ) {
    int x;
    if( in &gt;&gt; x ) i.m_x = x;
    return in;
}

int main() {
    Foo&lt; int &gt;::Inn i;
    std::cin &gt;&gt; i;  // &lt;---- kompiliert nicht: 
       // no operator &quot;&gt;&gt;&quot; matches these operands
       //      operand types are: std::istream &gt;&gt; Foo&lt;int&gt;::Inn
    return 0;
}
</code></pre>
<p>Meine Compiler (VC7 Comeau) sind beide in der markierten Zeile der Meinung, dass es keinen operator&gt;&gt;( std::istream&amp; in, Foo&lt; int &gt;::Inn&amp; i ) gibt. Was mache ich falsch? Deklariere ich die Streaming-Funktion konkret mit einem int, statt als Template, so funkt's.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/918459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/918459</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 15 Nov 2005 12:40:12 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer &#x27;inner struct&#x27; eines Templates von istream compiliert nicht on Tue, 15 Nov 2005 12:43:42 GMT]]></title><description><![CDATA[<p>Die automatische Auflösung der Templates hat irgendwo ihre Grenzen - und ganz offensichtlich hast du diese Grenzen ausgelotet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/918469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/918469</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 15 Nov 2005 12:43:42 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer &#x27;inner struct&#x27; eines Templates von istream compiliert nicht on Tue, 15 Nov 2005 12:48:55 GMT]]></title><description><![CDATA[<p>wäre nett, wenn Du etwas konkreter werden könntest <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> . Der Typ der Variable 'i' in main() ist jedenfalls glasklar definiert.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/918480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/918480</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 15 Nov 2005 12:48:55 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer &#x27;inner struct&#x27; eines Templates von istream compiliert nicht on Tue, 15 Nov 2005 18:15:23 GMT]]></title><description><![CDATA[<p>so gehts:</p>
<pre><code class="language-cpp">operator&gt;&gt;&lt;int&gt;(std::cin, i);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/918538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/918538</guid><dc:creator><![CDATA[kleiner_tipp]]></dc:creator><pubDate>Tue, 15 Nov 2005 18:15:23 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer &#x27;inner struct&#x27; eines Templates von istream compiliert nicht on Tue, 15 Nov 2005 18:52:43 GMT]]></title><description><![CDATA[<p>in dem fall macht dir einfach 14.8.2.4 (3 und 4) einen strich durch die rechnung...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/918578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/918578</guid><dc:creator><![CDATA[davie]]></dc:creator><pubDate>Tue, 15 Nov 2005 18:52:43 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer &#x27;inner struct&#x27; eines Templates von istream compiliert nicht on Tue, 15 Nov 2005 21:05:04 GMT]]></title><description><![CDATA[<p>davie schrieb:</p>
<blockquote>
<p>in dem fall macht dir einfach 14.8.2.4 (3 und 4) einen strich durch die rechnung...</p>
</blockquote>
<p>Danke Davie,</p>
<p>in 14.8.2.4 Paragraph 4 steht tatsächlich, dass das Template so nicht aufgelöst wird. Warum das so sein muss, habe ich nicht verstanden ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/918671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/918671</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 15 Nov 2005 21:05:04 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer &#x27;inner struct&#x27; eines Templates von istream compiliert nicht on Tue, 15 Nov 2005 22:39:15 GMT]]></title><description><![CDATA[<p>Hallo,<br />
es handelt sich hier um einen sogenannten non-deduced Context. Der Grund für die Existenz solcher nicht herleitbaren Kontexte ist einfach der, dass sie mehrdeutigkeiten zulassen (genaugenommen kann es eine unbegrentze Anzahl von Typen geben, die den non-deduced Context erfüllen könnten).<br />
Klassisches Beispiel:</p>
<pre><code class="language-cpp">template &lt;class T&gt; 
struct X { typedef T Y; } 

template &lt;&gt; 
struct X&lt;short&gt; { typedef int Y; } 

template &lt;class T&gt;
void f( typename X&lt;T&gt;::Y );

f( 42 ); // Ups. Mehrdeutig könnte X&lt;int&gt;::Y (also int) oder aber X&lt;short&gt;::Y (also auch int) sein.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/918737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/918737</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Tue, 15 Nov 2005 22:39:15 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer &#x27;inner struct&#x27; eines Templates von istream compiliert nicht on Tue, 15 Nov 2005 23:00:28 GMT]]></title><description><![CDATA[<p>Danke Hume für die Erklärung.</p>
<p>Das mit der Mehrdeutigkeit war mir im Prinzip schon klar. Die Frage, die ich mir hier Stelle ist, wieso mein Beispiel mehrdeutig sein kann.<br />
Du benutzt einen typedef auf einen 'bekannten' Typen. In meinem Beispiel ist dieser inner Typ eine Struct, die nach meinem Ermessen nur ein mögliches Argument zulässt.</p>
<pre><code class="language-cpp">Foo&lt; int &gt;::Inn i;
    std::cin &gt;&gt; i;
</code></pre>
<p>an dieser Stelle habe ich keine Idee wie man eine Mehrdeutigkeit mit dieser - oder einer anderen - Template-Funktion konstruieren kann.</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
std::istream&amp; operator&gt;&gt;( std::istream&amp; in, typename Foo&lt; T &gt;::Inn&amp; i )
</code></pre>
<p>Ich verstehe 14.8.2.4 so, dass grundsätzlcih alle diese Fälle ausgeschlossen sind, weil einige Konstruktionen dieser Art (wie Dein Beispiel) eben grundsätzlich mehrdeutig sein können.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/918748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/918748</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 15 Nov 2005 23:00:28 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer &#x27;inner struct&#x27; eines Templates von istream compiliert nicht on Tue, 15 Nov 2005 23:10:24 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>an dieser Stelle habe ich keine Idee wie man eine Mehrdeutigkeit mit dieser - oder einer anderen - Template-Funktion konstruieren kann.</p>
</blockquote>
<p>doch - tatsächlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
<pre><code class="language-cpp">template&lt; typename T &gt;
struct Foo {
    struct Inn {
        int m_x;
    };
    T m_y;
};

template&lt;&gt;
struct Foo&lt; bool &gt; {
    typedef Foo&lt; int &gt;::Inn Inn;
};
</code></pre>
<p>eine geradezu gemeine Konstruktion; man muss nur lange genug drüber nachdenken, bis man's findet. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Noch mal Danke Hume<br />
Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/918752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/918752</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 15 Nov 2005 23:10:24 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer &#x27;inner struct&#x27; eines Templates von istream compiliert nicht on Tue, 15 Nov 2005 23:15:50 GMT]]></title><description><![CDATA[<blockquote>
<p>an dieser Stelle habe ich keine Idee wie man eine Mehrdeutigkeit mit dieser - oder einer anderen - Template-Funktion konstruieren kann.</p>
</blockquote>
<p>Z.B. so:</p>
<pre><code class="language-cpp">struct Bar { typedef Foo&lt;int&gt;::In In };
</code></pre>
<p>Nun hast du wieder eine Mehrdeutigkeit. Theoretisch könnte der Compiler diese natürlich erkennen und auflösen (Bar::In ist ja äquivalent zu Foo&lt;int&gt;::In). Nur dazu müsste der Compiler letztlich anfangen Typgleichungen zu lösen (bzw. alle Typen auf solche Mehrdeutigkeiten überprüfen). Was die Komplexität natürlich weiter in die Höhe schrauben würde (und die Compilezeit). Für solche Sachen eignet sich OCaml dann wohl doch besser <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/918755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/918755</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Tue, 15 Nov 2005 23:15:50 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer &#x27;inner struct&#x27; eines Templates von istream compiliert nicht on Tue, 15 Nov 2005 23:16:49 GMT]]></title><description><![CDATA[<p>Sorry, zwischen Gang zum Kühlschrank und Posten nicht aktualisert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/918756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/918756</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Tue, 15 Nov 2005 23:16:49 GMT</pubDate></item></channel></rss>