<?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[Komposition von Template-Klassen]]></title><description><![CDATA[<p>Hi,<br />
folgendes Codestück bereitet mir Sorgen:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class scalar {
	public:
		typedef T value_type;

		scalar(value_type const&amp; t)
			: value_(t) {}

		value_type&amp; operator()() {
			return value_;
		}

	private:
		value_type value_;
};

template &lt;typename T&gt;
class expr {
	public:
		typedef T expr_type;

		expr(expr_type const&amp; t)
	   		: expr_(t) {}

		expr_type&amp; operator()() {
			return expr_();
		}

	private:
		expr_type&amp; expr_;
};

int main() {
	scalar&lt;int&gt; s(2);
	expr&lt;scalar&lt;int&gt; &gt; e(s);	
	return 0;
}
</code></pre>
<p>Fehlermeldung:</p>
<pre><code>expr_templ.cpp: In constructor ‘expr&lt;T&gt;::expr(const T&amp;) [with T = scalar&lt;int&gt;]’:
expr_templ.cpp:35:   instantiated from here
expr_templ.cpp:23: error: invalid initialization of reference of type ‘scalar&lt;int&gt;&amp;’ from expression of type ‘const scalar&lt;int&gt;’
</code></pre>
<p>Im Endeffekt soll das Erstellen eines Expressiontrees möglich sein.<br />
Woran scheitert es hier?</p>
<p>mfg und guten Rutsch</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/169039/komposition-von-template-klassen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 16:15:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/169039.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 31 Dec 2006 18:36:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Komposition von Template-Klassen on Sun, 31 Dec 2006 18:36:00 GMT]]></title><description><![CDATA[<p>Hi,<br />
folgendes Codestück bereitet mir Sorgen:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class scalar {
	public:
		typedef T value_type;

		scalar(value_type const&amp; t)
			: value_(t) {}

		value_type&amp; operator()() {
			return value_;
		}

	private:
		value_type value_;
};

template &lt;typename T&gt;
class expr {
	public:
		typedef T expr_type;

		expr(expr_type const&amp; t)
	   		: expr_(t) {}

		expr_type&amp; operator()() {
			return expr_();
		}

	private:
		expr_type&amp; expr_;
};

int main() {
	scalar&lt;int&gt; s(2);
	expr&lt;scalar&lt;int&gt; &gt; e(s);	
	return 0;
}
</code></pre>
<p>Fehlermeldung:</p>
<pre><code>expr_templ.cpp: In constructor ‘expr&lt;T&gt;::expr(const T&amp;) [with T = scalar&lt;int&gt;]’:
expr_templ.cpp:35:   instantiated from here
expr_templ.cpp:23: error: invalid initialization of reference of type ‘scalar&lt;int&gt;&amp;’ from expression of type ‘const scalar&lt;int&gt;’
</code></pre>
<p>Im Endeffekt soll das Erstellen eines Expressiontrees möglich sein.<br />
Woran scheitert es hier?</p>
<p>mfg und guten Rutsch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1200450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200450</guid><dc:creator><![CDATA[zeronull]]></dc:creator><pubDate>Sun, 31 Dec 2006 18:36:00 GMT</pubDate></item><item><title><![CDATA[Reply to Komposition von Template-Klassen on Sun, 31 Dec 2006 18:57:36 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;typename T&gt; class scalar 
{
    public:
        typedef T value_type;
        scalar(value_type const&amp; t) : value_(t) {}
        value_type&amp; operator()() { return value_; }
    private:
        value_type value_;
};

template &lt;typename T&gt; class expr 
{
    public:
        typedef T expr_type;
        expr(expr_type &amp;t) : expr_(t) {}
        expr_type&amp; operator()() { return expr_(); }
    private:
        expr_type&amp; expr_;
};

int main() 
{
    scalar&lt;int&gt; s(2);
    expr&lt; scalar&lt;int&gt; &gt; e(s);  
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1200458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200458</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Sun, 31 Dec 2006 18:57:36 GMT</pubDate></item><item><title><![CDATA[Reply to Komposition von Template-Klassen on Sun, 31 Dec 2006 20:10:06 GMT]]></title><description><![CDATA[<p>hmpf, danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1200478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1200478</guid><dc:creator><![CDATA[zeronull]]></dc:creator><pubDate>Sun, 31 Dec 2006 20:10:06 GMT</pubDate></item><item><title><![CDATA[Reply to Komposition von Template-Klassen on Tue, 02 Jan 2007 14:11:27 GMT]]></title><description><![CDATA[<p>Wenn der Expression-Tree nur lesend auf die Daten zugreifen soll, dann kannst du auch beidesmal 'const' benutzen.<br />
- scalar</p>
<pre><code class="language-cpp">const value_type&amp; operator()() { return value_; }
</code></pre>
<p>- expr</p>
<pre><code class="language-cpp">expr(const expr_type &amp;t) : expr_(t) {}
const expr_type&amp; operator()() { return expr_(); }
private: 
  const expr_type&amp; expr_;
</code></pre>
<p>Auch sollten die operator()-Methoden selbst als const deklariert sein:</p>
<pre><code class="language-cpp">const expr_type&amp; operator()() const { return expr_(); }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1201172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201172</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 02 Jan 2007 14:11:27 GMT</pubDate></item><item><title><![CDATA[Reply to Komposition von Template-Klassen on Tue, 02 Jan 2007 15:25:54 GMT]]></title><description><![CDATA[<p>Hi zeronull,</p>
<p>mal ein kleiner Tipp von mir: Fehler findet man schneller, wenn man weiter reduziert (hast Du bestimmt schon gemacht) - am Besten erstmal &quot;un-template-isiert&quot;:</p>
<pre><code class="language-cpp">class expr {
public:
    expr(int const&amp; t) : expr_(t) {}
private:
    int&amp; expr_;
};
</code></pre>
<p>Das hier läuft nämlich schon auf denselben Fehler ... und da ist vielleicht auch klarer, warum der Compiler eine non-const Referenz nicht an eine const-Referenz binden will. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Mein Arbeitskollege hantiert auch viel mit templates herum ... und in 90% der Fälle hat der Fehler nichts damit zu tun, dass es templates sind. Daher immer meine erste Frage: &quot;Läuft's denn mit der konkreten Klasse/Funktion ?&quot;.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201224</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 02 Jan 2007 15:25:54 GMT</pubDate></item></channel></rss>