<?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[[Gelöst] TemplateObjekt als Übergabe in Funktion]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klassentemplate für Zeitmessungen:</p>
<pre><code>template &lt;class T&gt; class MeasureGeneric {
   MeasureGeneric&lt;T&gt;(T var, const int &amp;length) {...}
};
</code></pre>
<p>Nun möchte ich in einer anderen Klasse (class Variable) ein solch erstelltes Objekt-Template übergeben, um es auszuwerten. Dazu habe ich in der Klasse Variable eine solche Methode definiert:</p>
<pre><code>class Variable
{
public:
  void setMeasureBasicOperations(MeasureGeneric&lt;class T&gt; &amp;varOps);
};
</code></pre>
<p>Die Objekte erstelle ich nun mit folgendem Aufruf z.B.:</p>
<pre><code>double varDouble = 0;
MeasureGeneric&lt;double&gt; varClass(varDouble, var.getLength());
</code></pre>
<p>Soweit klappt dies auch. Möchte ich jetzt allerdings auswerten, was ich mit</p>
<pre><code>Variable var;
var.setMeasureBasicOperations(varClass);
</code></pre>
<p>tue, bekomme ich allerdings vom gcc die Fehlermeldung zurück:</p>
<pre><code>error: no matching function for call to Variable::setMeasureBasicOperations(MeasureGeneric&lt;double&gt;&amp;)’
candidates are: void Variable::setMeasureBasicOperations(MeasureGeneric&lt;T&gt;&amp;)
</code></pre>
<p>Ich habe den Verdacht, dass er nicht erkennt, dass in der Methode &quot;setMeasureBasicOperations(...)&quot; Templates verwendet werden. Wie muss ich dies ändern, damit der Compiler dies korrekt erkennt?</p>
<p>Vielen Dank schon mal.</p>
<p>Viele Grüße,</p>
<p>Tobias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286256/gelöst-templateobjekt-als-übergabe-in-funktion</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 23:57:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286256.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 May 2011 14:57:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Gelöst] TemplateObjekt als Übergabe in Funktion on Fri, 06 May 2011 19:19:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klassentemplate für Zeitmessungen:</p>
<pre><code>template &lt;class T&gt; class MeasureGeneric {
   MeasureGeneric&lt;T&gt;(T var, const int &amp;length) {...}
};
</code></pre>
<p>Nun möchte ich in einer anderen Klasse (class Variable) ein solch erstelltes Objekt-Template übergeben, um es auszuwerten. Dazu habe ich in der Klasse Variable eine solche Methode definiert:</p>
<pre><code>class Variable
{
public:
  void setMeasureBasicOperations(MeasureGeneric&lt;class T&gt; &amp;varOps);
};
</code></pre>
<p>Die Objekte erstelle ich nun mit folgendem Aufruf z.B.:</p>
<pre><code>double varDouble = 0;
MeasureGeneric&lt;double&gt; varClass(varDouble, var.getLength());
</code></pre>
<p>Soweit klappt dies auch. Möchte ich jetzt allerdings auswerten, was ich mit</p>
<pre><code>Variable var;
var.setMeasureBasicOperations(varClass);
</code></pre>
<p>tue, bekomme ich allerdings vom gcc die Fehlermeldung zurück:</p>
<pre><code>error: no matching function for call to Variable::setMeasureBasicOperations(MeasureGeneric&lt;double&gt;&amp;)’
candidates are: void Variable::setMeasureBasicOperations(MeasureGeneric&lt;T&gt;&amp;)
</code></pre>
<p>Ich habe den Verdacht, dass er nicht erkennt, dass in der Methode &quot;setMeasureBasicOperations(...)&quot; Templates verwendet werden. Wie muss ich dies ändern, damit der Compiler dies korrekt erkennt?</p>
<p>Vielen Dank schon mal.</p>
<p>Viele Grüße,</p>
<p>Tobias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059569</guid><dc:creator><![CDATA[Sir_Tobias]]></dc:creator><pubDate>Fri, 06 May 2011 19:19:30 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] TemplateObjekt als Übergabe in Funktion on Fri, 06 May 2011 15:01:18 GMT]]></title><description><![CDATA[<p>Du müsstest entweder die <code>Variable</code> -Klasse oder zumindest die betroffene Methode zu einem Template machen - oder du änderst den Parameter in <code>MeasureGeneric&lt;double&gt;</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059572</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 06 May 2011 15:01:18 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] TemplateObjekt als Übergabe in Funktion on Fri, 06 May 2011 15:07:59 GMT]]></title><description><![CDATA[<p>Im Parameter der Funktion in variable muss Class t bereits durch einen Typen ersetzt werden, der erwartet wird. Das würde so nur gehn wenn variable auch ein template wäre, jedoch würde die Funktion den Typen erwarten mit dem die Instanz von var selbst definiert wurde z.b bei Var&lt;int&gt; var; ein int.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059576</guid><dc:creator><![CDATA[guest...]]></dc:creator><pubDate>Fri, 06 May 2011 15:07:59 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] TemplateObjekt als Übergabe in Funktion on Fri, 06 May 2011 15:10:04 GMT]]></title><description><![CDATA[<p>Mist zu langsam. Tja Smartphone Tastatur... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059578</guid><dc:creator><![CDATA[guest...]]></dc:creator><pubDate>Fri, 06 May 2011 15:10:04 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] TemplateObjekt als Übergabe in Funktion on Fri, 06 May 2011 15:19:49 GMT]]></title><description><![CDATA[<p>Ah, ich verstehe. In dem Falle würde ich nur die Methode zum Template machen wollen.<br />
Müßte dann, wenn ich es richtig verstehe, etwa so aussehen:</p>
<pre><code>class Variable
{
public:
   template &lt;class S&gt; void setMeasureBasicOperations(MeasureGeneric&lt;class T&gt; &amp;varOps);
};
</code></pre>
<p>Ich habe deswegen &quot;class S&quot; genommen, da GCC sonst moniert, dass template &quot;T&quot; nach der Definition von &quot;class&quot; genommen wird:</p>
<pre><code>error: using template type parameter ‘T’ after ‘class’
</code></pre>
<p>Allerdings bin ich etwas ratlos, wie ich das aufrufen soll, da hierbei</p>
<pre><code>double varDouble = 0;
MeasureGeneric&lt;double&gt; varClass(varDouble, var.getLength());
var.setMeasureBasicOperations&lt;double&gt;(varClass);
</code></pre>
<p>der GCC meckert, dass er die Funktion nicht findet?</p>
<pre><code>error: no matching function for call to ‘Variable::setMeasureBasicOperations(MeasureGeneric&lt;double&gt;&amp;)’
</code></pre>
<p>Vielen Dank auf jeden Fall für die schnelle Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059582</guid><dc:creator><![CDATA[Sir_Tobias]]></dc:creator><pubDate>Fri, 06 May 2011 15:19:49 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] TemplateObjekt als Übergabe in Funktion on Fri, 06 May 2011 15:31:02 GMT]]></title><description><![CDATA[<p>Sir_Tobias schrieb:</p>
<blockquote>
<p>Ah, ich verstehe. In dem Falle würde ich nur die Methode zum Template machen wollen.<br />
Müßte dann, wenn ich es richtig verstehe, etwa so aussehen:</p>
<pre><code>class Variable
{
public:
   template &lt;class S&gt; void setMeasureBasicOperations(MeasureGeneric&lt;class T&gt; &amp;varOps);
};
</code></pre>
</blockquote>
<p>Nein, dort hinten gehört kein &quot;class&quot; hin:</p>
<pre><code class="language-cpp">template &lt;class T&gt; void setMeasureBasicOperations(MeasureGeneric&lt;T&gt; &amp;varOps);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2059588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059588</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 06 May 2011 15:31:02 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] TemplateObjekt als Übergabe in Funktion on Fri, 06 May 2011 15:49:59 GMT]]></title><description><![CDATA[<p>Vielen, vielen Dank für die schnelle Hilfe.<br />
Jetzt klappt das auch mit den Aufrufen.</p>
<p>Ein allgemeine Frage hätte ich noch zur Code-Übersichtlichkeit:</p>
<p>Gibt es auch die Möglichkeit, die Methoden-Implementation der Templates in die CPP-Dateien auszulagern? Es wird sonst schnell unübersichtlich, wenn man die gesamte Implementation in die Header-Datei stopfen muss.</p>
<p>Wenn ich versuche, die Implementation auszulagern, beschwert sich der Linker über &quot;undefined references&quot;. Gibt es da die Möglichkeiten von sogenannten &quot;forward declarations&quot;?</p>
<p>Viele Grüße,</p>
<p>Tobias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059594</guid><dc:creator><![CDATA[Sir_Tobias]]></dc:creator><pubDate>Fri, 06 May 2011 15:49:59 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] TemplateObjekt als Übergabe in Funktion on Fri, 06 May 2011 16:14:39 GMT]]></title><description><![CDATA[<p>Das geht nur, wenn du alle später zu verwendenden Spezialisierungen mit angibst.<br />
Alternativ gibt es auch die Möglichkeit, die Template-Definitionen in eine impl-Datei auszulagern, die du am Ende des Headers einbindest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059615</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 06 May 2011 16:14:39 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] TemplateObjekt als Übergabe in Funktion on Fri, 06 May 2011 16:19:40 GMT]]></title><description><![CDATA[<p>Sir_Tobias schrieb:</p>
<blockquote>
<p>Gibt es auch die Möglichkeit, die Methoden-Implementation der Templates in die CPP-Dateien auszulagern?</p>
</blockquote>
<p>Nein. Die Definitionen müssen zur Compilezeit immer sichtbar sein, d.h. wenn der Compiler den Header gelesen hat, muss er in der gleichen Übersetzungseinheit auch die Definitionen finden.</p>
<p>Manche machen es so, dass sie die Definitionen in eine separate Datei schreiben und diese am Ende des Headers includen.<br />
Den gleichen Effekt hat es, die definitionen im header, aber außerhalb der Klassendefinition zu schreiben:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Foo
{
public:
  Foo(T const&amp;);

  void bar(int i);
};

template &lt;class T&gt;
Foo&lt;T&gt;::Foo(T const&amp; t) { /* ... */ }

template &lt;class T&gt;
void Foo&lt;T&gt;::bar(int i) { /* ... */ }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2059619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059619</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 06 May 2011 16:19:40 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] TemplateObjekt als Übergabe in Funktion on Fri, 06 May 2011 19:19:07 GMT]]></title><description><![CDATA[<p>Ah, ok, vielen vielen Dank für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059738</guid><dc:creator><![CDATA[Sir_Tobias]]></dc:creator><pubDate>Fri, 06 May 2011 19:19:07 GMT</pubDate></item></channel></rss>