<?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[Template von teilbekanntem Template]]></title><description><![CDATA[<p>Beim Übersetzen des folgenden Codes</p>
<pre><code class="language-cpp">template&lt;class CLASS, template&lt;typename CLASS&gt; class CLASS_EXT&gt;
class CBeta {
public:
   CBeta() { }
};
template&lt;class CLASS&gt;
class CAlpha {
public:
   // Hier folgt eine fehlerhafte Zeile
   CAlpha(CBeta&lt;typename CLASS, typename CAlpha&lt;typename CLASS&gt; &gt; *pPointer) { }
};
</code></pre>
<p>liefert der cl9.0 folgdenden Fehler:</p>
<blockquote>
<p>Ungültiges Vorlagenargument für den Vorlagenparameter 'CLASS_EXT'; Klassenvorlage erwartet</p>
</blockquote>
<p>Leider verstehe bzw. weiß ich nicht, wie bzw. ob dieser Fehler behoben werden kann. Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/298364/template-von-teilbekanntem-template</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 21:37:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298364.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Jan 2012 15:39:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template von teilbekanntem Template on Wed, 18 Jan 2012 15:39:42 GMT]]></title><description><![CDATA[<p>Beim Übersetzen des folgenden Codes</p>
<pre><code class="language-cpp">template&lt;class CLASS, template&lt;typename CLASS&gt; class CLASS_EXT&gt;
class CBeta {
public:
   CBeta() { }
};
template&lt;class CLASS&gt;
class CAlpha {
public:
   // Hier folgt eine fehlerhafte Zeile
   CAlpha(CBeta&lt;typename CLASS, typename CAlpha&lt;typename CLASS&gt; &gt; *pPointer) { }
};
</code></pre>
<p>liefert der cl9.0 folgdenden Fehler:</p>
<blockquote>
<p>Ungültiges Vorlagenargument für den Vorlagenparameter 'CLASS_EXT'; Klassenvorlage erwartet</p>
</blockquote>
<p>Leider verstehe bzw. weiß ich nicht, wie bzw. ob dieser Fehler behoben werden kann. Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169621</guid><dc:creator><![CDATA[Weispfenning]]></dc:creator><pubDate>Wed, 18 Jan 2012 15:39:42 GMT</pubDate></item><item><title><![CDATA[Reply to Template von teilbekanntem Template on Wed, 18 Jan 2012 15:46:30 GMT]]></title><description><![CDATA[<p>1. Entferne die Typename's in Zeile 10<br />
2. Der zweite Templateparameter von CBeta muss vom Typ template&lt;class CLASS&gt; sein, also musst du in Zeile 10 typename CAlpha&lt;typename CLASS&gt; &gt; durch CAlpha ersetzen (CAlpha ist ein Template, also passt es in das zweite Argument von CBeta.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169623</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 18 Jan 2012 15:46:30 GMT</pubDate></item><item><title><![CDATA[Reply to Template von teilbekanntem Template on Wed, 18 Jan 2012 15:59:03 GMT]]></title><description><![CDATA[<p>pyhax, vielen Dank für die schnelle Antwort!</p>
<p>Folgender, geänderter Code, liefert die selbe Fehlermeldung.</p>
<pre><code class="language-cpp">template&lt;class CLASS, template&lt;typename CLASS&gt; class CLASS_EXT&gt;
class CBeta {
public:
   CBeta() { }
};
template&lt;class CLASS&gt;
class CAlpha {
public:
   // Hier folgt eine fehlerhafte Zeile
   CAlpha(CBeta&lt;CLASS, CAlpha&gt; *pPointer) { }
};
</code></pre>
<p>Habe ich bei den Änderungen etwas übersehen? Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169631</guid><dc:creator><![CDATA[Weispfenning]]></dc:creator><pubDate>Wed, 18 Jan 2012 15:59:03 GMT</pubDate></item><item><title><![CDATA[Reply to Template von teilbekanntem Template on Wed, 18 Jan 2012 16:07:01 GMT]]></title><description><![CDATA[<p>Wie sieht den der Code aus der die Klasse benutzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169635</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 18 Jan 2012 16:07:01 GMT</pubDate></item><item><title><![CDATA[Reply to Template von teilbekanntem Template on Wed, 18 Jan 2012 16:14:36 GMT]]></title><description><![CDATA[<p>Es gibt bisher keinen Code, der die beiden Templates verwendet. Ich werde aber mal einen schreiben, eine gute Idee, vielleicht sehe ich dann klarer. Der Fehler wird aber wohl bestehen bleiben ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169641</guid><dc:creator><![CDATA[Weispfenning]]></dc:creator><pubDate>Wed, 18 Jan 2012 16:14:36 GMT</pubDate></item><item><title><![CDATA[Reply to Template von teilbekanntem Template on Wed, 18 Jan 2012 16:37:03 GMT]]></title><description><![CDATA[<p>Wenn ich sowas hier mache:</p>
<pre><code class="language-cpp">template&lt;class CLASS, template&lt;typename CLASS&gt; class CLASS_EXT&gt;
class CBeta {
public:
   CBeta() { }
};
template&lt;class CLASS&gt;
class CAlpha {
public:
   // Hier folgt eine fehlerhafte Zeile
   CAlpha(CBeta&lt;CLASS, CAlpha&gt; *pPointer) { }
};

int main() {
}
</code></pre>
<p>funktioniert es bei mir ... (GCC) 4.6.2<br />
Allerding bekomme ich eine Warnung:</p>
<pre><code>warning: injected-class-name `CAlpha&lt;CLASS&gt;::CAlpha' used as template template argument
</code></pre>
<p>EDIT: Probier mal in der fehlerhaften Zeile CAlpha durch ::CAlpha zu ersetzen. (also <code>CAlpha(CBeta&lt;CLASS, ::CAlpha&gt; *pPointer) { }</code> ) Bei mir ist die Warnung dann weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169652</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 18 Jan 2012 16:37:03 GMT</pubDate></item><item><title><![CDATA[Reply to Template von teilbekanntem Template on Wed, 18 Jan 2012 16:45:45 GMT]]></title><description><![CDATA[<p>pyhax schrieb:</p>
<blockquote>
<p>Allerding bekomme ich eine Warnung:</p>
<pre><code>warning: injected-class-name `CAlpha&lt;CLASS&gt;::CAlpha' used as template template argument
</code></pre>
<p>EDIT: Probier mal in der fehlerhaften Zeile CAlpha durch ::CAlpha zu ersetzen. (also <code>CAlpha(CBeta&lt;CLASS, ::CAlpha&gt; *pPointer) { }</code> ) Bei mir ist die Warnung dann weg.</p>
</blockquote>
<p>Das setzt dann aber voraus, dass CAlpha im globalen Namensraum zu finden ist, also keine optimale Lösung. Die bloße Verwendung von CAlpha hier ist kein Fehler (14.6.1/1), der Nutzen der Warnung erschließt sich mir nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2169665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2169665</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 18 Jan 2012 16:45:45 GMT</pubDate></item><item><title><![CDATA[Reply to Template von teilbekanntem Template on Thu, 19 Jan 2012 13:17:13 GMT]]></title><description><![CDATA[<p>Zusammenfassend,</p>
<p>folgdender Code läßt sich mit cl9.0 übersetzen und ausführen:</p>
<pre><code class="language-cpp">template&lt;class CLASS, template&lt;class CLASS&gt; class CLASS_EXT&gt;
class CGamma {
public:
   CGamma() { p1 = NULL; p2 = NULL; }
protected:
   CLASS *p1;
   CLASS_EXT&lt;CLASS&gt; *p2;
};
template&lt;class CLASS&gt;
class CBeta {
public:
   CBeta() { p = NULL; }
   CBeta(CGamma&lt;CLASS, ::CBeta&gt; *p) { this-&gt;p = p; }
   ~CBeta() { if(p) delete p; }
   const CGamma&lt;CLASS, ::CBeta&gt; *Get() const { return p; }
protected:
   CGamma&lt;CLASS, ::CBeta&gt; *p; // gcc wohl auch: CGamma&lt;CLASS, CBeta&gt; *p
};
class CAlpha {
public:
   CAlpha();
};
int main(int argc, char* argv[])
{
   CBeta&lt;CAlpha&gt; beta(new CGamma&lt;CAlpha, CBeta&gt;());
   const CGamma&lt;CAlpha, CBeta&gt; *p = beta.Get();
   return 0;
}
</code></pre>
<p>Mein (Haupt-) Fehler (neben <code>(CGamma&lt;CLASS, ::CBeta&lt;CLASS&gt; &gt;</code> statt <code>(CGamma&lt;CLASS, ::CBeta&gt;</code> ) bestand darin, statt <code>::CBeta</code> einfach nur <code>CBeta</code> geschrieben zu haben. Der cl9.0 beschwert sich mit folgendem Fehler:</p>
<blockquote>
<p>Ungültiges Vorlagenargument für den Vorlagenparameter 'CLASS_EXT'; Klassenvorlage erwartet</p>
</blockquote>
<p>Der gcc scheint laut Auskunft eines Kollegen hier nur eine Warnung auszugeben. Und genau das habe ich noch nicht ganz verstanden: Warum ist <code>::</code> vor <code>::CBeta</code> nötig? Welcher &quot;andere&quot; globale Namensraum (Mehrdeutigkeit?) ist denn hier gemein, da man doch ohne <code>::</code> bereits den globalen Namensraum anspricht?</p>
<p>An alle die mir bis hierher weitergeholfen haben ein 42-faches Dankeschön!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170054</guid><dc:creator><![CDATA[Weispfenning]]></dc:creator><pubDate>Thu, 19 Jan 2012 13:17:13 GMT</pubDate></item><item><title><![CDATA[Reply to Template von teilbekanntem Template on Thu, 19 Jan 2012 13:27:48 GMT]]></title><description><![CDATA[<p>Weispfenning schrieb:</p>
<blockquote>
<p>Warum ist <code>::</code> vor <code>::CBeta</code> nötig? Welcher &quot;andere&quot; globale Namensraum (Mehrdeutigkeit?) ist denn hier gemein, da man doch ohne <code>::</code> bereits den globalen Namensraum anspricht?</p>
</blockquote>
<p>Der Clou ist, dass Innerhalb einer Klasse der Name der Klasse selbst nochmal injiziert wird. Im Scope einer Klasse A im globalen namespace ist also nicht nur das Symbol ::A für die Klasse bekannt, sondern auch ::A::A. Und ::A::A::A::A::A. und so weiter. Soweit zur &quot;scheinbaren&quot; Mehrdeutigkeit. Warum der Compiler da groß meckert wundert mich allerdings auch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170057</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 19 Jan 2012 13:27:48 GMT</pubDate></item><item><title><![CDATA[Reply to Template von teilbekanntem Template on Thu, 19 Jan 2012 14:27:50 GMT]]></title><description><![CDATA[<blockquote>
<p>Im Scope einer Klasse A im globalen namespace ist also nicht nur das Symbol ::A für die Klasse bekannt, sondern auch ::A::A. Und ::A::A::A::A::A. und so weiter.</p>
</blockquote>
<p>Das kann ich mit dem cl9.0 nicht nachvollziehen, wahrscheinlich weil ich es nicht richtig verstanden habe. Bei folgendem Code gibt der cl9.0 an den markierten Stellen einen Fehler aus:</p>
<pre><code class="language-cpp">class A
{
public:
   ::A    *p1; // Ok
   ::A::A *p2; // Fehler
};
int main(int argc, char* argv[])
{
   ::A    a1; // Ok
   ::A::A a2; // Fehler
}
</code></pre>
<p>Im Gültigkeitsbereich der Klasse A ist also A und ::A (wobei A und ::A exakt das selbe ist) bekannt, nicht aber ::A::A (für den cl9.0). Weiter oben in der Diskussion haben wir aber gesehen, dass für den cl9.0 (wohl nicht für den gcc) aber eben A nicht gleich ::A ist. Das verwirrt mich etwas.</p>
<p>Bisher dachte ich nämlich, dass A und ::A exakt das selbe ist, weshalb ich bisher noch nie ::A verwendet habe, sondern immer A. Weiß jemand, für was das vorangestellte :: genau steht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170082</guid><dc:creator><![CDATA[Weispfenning]]></dc:creator><pubDate>Thu, 19 Jan 2012 14:27:50 GMT</pubDate></item><item><title><![CDATA[Reply to Template von teilbekanntem Template on Thu, 19 Jan 2012 16:03:15 GMT]]></title><description><![CDATA[<p>Weispfenning schrieb:</p>
<blockquote>
<blockquote>
<p>Im Scope einer Klasse A im globalen namespace ist also nicht nur das Symbol ::A für die Klasse bekannt, sondern auch ::A::A. Und ::A::A::A::A::A. und so weiter.</p>
</blockquote>
<p>Das kann ich mit dem cl9.0 nicht nachvollziehen, wahrscheinlich weil ich es nicht richtig verstanden habe. Bei folgendem Code gibt der cl9.0 an den markierten Stellen einen Fehler aus:</p>
<pre><code class="language-cpp">class A
{
public:
   ::A    *p1; // Ok
   ::A::A *p2; // Fehler
};
int main(int argc, char* argv[])
{
   ::A    a1; // Ok
   ::A::A a2; // Fehler
}
</code></pre>
<p>Im Gültigkeitsbereich der Klasse A ist also A und ::A (wobei A und ::A exakt das selbe ist) bekannt, nicht aber ::A::A (für den cl9.0). Weiter oben in der Diskussion haben wir aber gesehen, dass für den cl9.0 (wohl nicht für den gcc) aber eben A nicht gleich ::A ist. Das verwirrt mich etwas.</p>
<p>Bisher dachte ich nämlich, dass A und ::A exakt das selbe ist, weshalb ich bisher noch nie ::A verwendet habe, sondern immer A. Weiß jemand, für was das vorangestellte :: genau steht?</p>
</blockquote>
<p>A und ::A sind dann gleich, wenn A selbst im globalen Namensraum deklariert wurde. A::A::A::A ist ein bisschen gemein zu demonstrieren, weil A::A je nach Kontext auch auf den Konstruktor verweisen kann. An den Stellen, an denen der Konstruktor gemeint sein könnte, verweist A::A dann auch darauf.</p>
<pre><code class="language-cpp">namespace foo
{
    struct A
    {
        A();
    };
    A::A() {}                // Verweist auf Konstruktor
    A::A::A a;               // Fehler, A::A ist hier der Konstruktor, und kann nicht als Namensraumspezifikation benutzt werden
    struct A::A::A::A b;     // ok, A::A kann hier nicht auf den Konstruktor verweisen
    struct ::A::A::A c;      // Fehler, keine Entität A im globalen Namensraum
    struct foo::A::A::A d;   // ok
    struct ::foo::A::A::A e; // ok
    struct B : A::A::A {};   // ok
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2170123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170123</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 19 Jan 2012 16:03:15 GMT</pubDate></item><item><title><![CDATA[Reply to Template von teilbekanntem Template on Thu, 19 Jan 2012 16:09:47 GMT]]></title><description><![CDATA[<p>Das :: steht für den globalen Scope. Beispiel:</p>
<pre><code class="language-cpp">int irgendwas;

void machWas() {
  int irgendwas = 2;
  ::irgendwas=irgendwas; //Setzt das Globale irgendwas auf den Wert vom lokalen irgendwas (2)
}
</code></pre>
<p>Nicht sehr sinvolles Beispiel, ich weiß.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170126</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Thu, 19 Jan 2012 16:09:47 GMT</pubDate></item><item><title><![CDATA[Reply to Template von teilbekanntem Template on Thu, 19 Jan 2012 16:15:03 GMT]]></title><description><![CDATA[<p>Noch eine nicht ganz intuitive Kleinigkeit zu A::A</p>
<pre><code class="language-cpp">struct A
{
   A(int) {}
};

int main()
{
   A(42);              // ok function style cast -&gt; Konstruktoraufruf
   A::A(42);             // Fehler, A::A IST der Konstruktor und kann nicht direkt aufgerufen werden
   (A)10;              // ok
   (A::A)10;           // Fehler
   (struct A::A)10;    // ok
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2170128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170128</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 19 Jan 2012 16:15:03 GMT</pubDate></item><item><title><![CDATA[Reply to Template von teilbekanntem Template on Thu, 19 Jan 2012 17:57:22 GMT]]></title><description><![CDATA[<p>Das mit der Doppeldeutigkeit zwischen Konstruktor A::A und Klassenname A::A habe ich nun verstanden, danke! Zur Info, der cl9.0 scheint sich etwas anders zu verhalten, es ergeben sich für die zwei Beispiele von camper folgendes:</p>
<pre><code class="language-cpp">namespace foo
{
    struct A
    {
        A();
    };
    A::A() {}
    A::A::A a;               // Fehler: Das Symbol links neben &quot;::&quot; muss ein Typ sein.
    struct A::A::A::A b;     // Fehler: Das Symbol links neben &quot;::&quot; muss ein Typ sein.
    struct ::A::A::A c;      // Fehler: Das Symbol links neben &quot;::&quot; muss ein Typ sein.
    struct foo::A::A::A d;   // Fehler: Das Symbol links neben &quot;::&quot; muss ein Typ sein.
    struct ::foo::A::A::A e; // Fehler: Das Symbol links neben &quot;::&quot; muss ein Typ sein.
    struct B : A::A::A {};   // Fehler: Das Symbol links neben &quot;::&quot; muss ein Typ sein.
}

struct A
{
   A(int) {}
};

int main()
{
   A(42);              // ok 
   A::A(42);           // KEIN Fehler!!
   (A)10;              // ok
   (A::A)10;           // Fehler: Syntaxfehler: Es fehlt ';' vor 'Konstante'
   (struct A::A)10;    // Fehler: Ist kein Element von 'A'
}
</code></pre>
<p>Ich bin hiermit erstmal zufrieden, da die Beispiele mir ohnehin etwas praxisfern erscheinen. Nochmals danke an alle!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2170167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2170167</guid><dc:creator><![CDATA[Weispfenning]]></dc:creator><pubDate>Thu, 19 Jan 2012 17:57:22 GMT</pubDate></item></channel></rss>