<?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[Implizite Templateparameter, wann geht das und wann nicht?]]></title><description><![CDATA[<p>Hallo,<br />
ich wundere mich etwas darüber, wann der Compiler klug genug ist, sich Templateparameter implizit zu erschließen und wann nicht. Besonders paradox sieht das ganze aus, wenn man ein Template indirekt benutzt:</p>
<pre><code class="language-cpp">template&lt;typename A, typename B&gt; class example{
private:
  A aa;
  B bb;
public:
  example(const A &amp; p1, const B &amp; p2): aa(p1), bb(p2) {}
  static double direct_static_member(const A&amp; a, const B&amp; b){
    return a*b;
  }
};

template&lt; typename A ,typename B&gt; inline double indirect_static_member(const A&amp; a, const B&amp; b){
  return example&lt;A,B&gt;::direct_static_member(a,b);
}

template&lt; typename A ,typename B&gt; inline example&lt;A,B&gt; indirect_constructor(const A&amp; a, const B&amp; b){
  return example&lt;A,B&gt;(a,b);
}

int main(){
  int a(1);
  double b(2.);

  indirect_static_member(a,b);                    // Gültiger Ausdruck, wird compiliert
  example::direct(a,b);                           // Ungültig, muss Typen explizit angeben...
  example&lt;int,double&gt;::direct_static_member(a,b); // ...so wie hier

  indirect_constructor(a,b);                      // Indirekt kann man den Konstruktor aufrufen
  example(a,b);                                   // Direkt wiederum nicht
  example&lt;int,double&gt;(a,b);                       // So ist es richtig
}
</code></pre>
<p>Offensichtlich werden im Fall von template-Funktionen die Parameter implizit angenommen und im Fall von Klassen nicht. Gibt es da einen tieferliegenden Grund für oder ist das einfach nur der C++-Standard? Oder ist einfach meine Syntax falsch und es gibt doch die Möglichkeit bei Klassen die Typen implizit anzugeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246718/implizite-templateparameter-wann-geht-das-und-wann-nicht</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 21:25:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246718.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 31 Jul 2009 16:06:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Implizite Templateparameter, wann geht das und wann nicht? on Fri, 31 Jul 2009 16:06:59 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich wundere mich etwas darüber, wann der Compiler klug genug ist, sich Templateparameter implizit zu erschließen und wann nicht. Besonders paradox sieht das ganze aus, wenn man ein Template indirekt benutzt:</p>
<pre><code class="language-cpp">template&lt;typename A, typename B&gt; class example{
private:
  A aa;
  B bb;
public:
  example(const A &amp; p1, const B &amp; p2): aa(p1), bb(p2) {}
  static double direct_static_member(const A&amp; a, const B&amp; b){
    return a*b;
  }
};

template&lt; typename A ,typename B&gt; inline double indirect_static_member(const A&amp; a, const B&amp; b){
  return example&lt;A,B&gt;::direct_static_member(a,b);
}

template&lt; typename A ,typename B&gt; inline example&lt;A,B&gt; indirect_constructor(const A&amp; a, const B&amp; b){
  return example&lt;A,B&gt;(a,b);
}

int main(){
  int a(1);
  double b(2.);

  indirect_static_member(a,b);                    // Gültiger Ausdruck, wird compiliert
  example::direct(a,b);                           // Ungültig, muss Typen explizit angeben...
  example&lt;int,double&gt;::direct_static_member(a,b); // ...so wie hier

  indirect_constructor(a,b);                      // Indirekt kann man den Konstruktor aufrufen
  example(a,b);                                   // Direkt wiederum nicht
  example&lt;int,double&gt;(a,b);                       // So ist es richtig
}
</code></pre>
<p>Offensichtlich werden im Fall von template-Funktionen die Parameter implizit angenommen und im Fall von Klassen nicht. Gibt es da einen tieferliegenden Grund für oder ist das einfach nur der C++-Standard? Oder ist einfach meine Syntax falsch und es gibt doch die Möglichkeit bei Klassen die Typen implizit anzugeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753079</guid><dc:creator><![CDATA[Karl R]]></dc:creator><pubDate>Fri, 31 Jul 2009 16:06:59 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Templateparameter, wann geht das und wann nicht? on Fri, 31 Jul 2009 17:39:04 GMT]]></title><description><![CDATA[<p>Ganz einfach: bei Funktionen weiß er ja bei den übergebenen Parametern, welchen Typ die haben und kann die entsprechenden Typen daraus herleiten. Bei Klassen geht das nicht. Die Rückgabetypen von Funktionen kann er z.B. auch nicht herleiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753123</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 31 Jul 2009 17:39:04 GMT</pubDate></item></channel></rss>