<?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[Problem mit Traits]]></title><description><![CDATA[<p>Hey @ all,<br />
ich beschäftige mich zur Zeit mit Templates in C++. Das ist mein Code</p>
<pre><code>template &lt;typename T&gt;
struct rgb{
	T data[3];
	static const int num_channels = 3;
	typedef T channel_value_type;
	rgb(){
		data[0]=data[1]=data[2]=(T)0;
	}

	rgb(const T&amp; v0, const T&amp; v1, const T&amp; v2){
		data[0] = v0;
		data[1] = v1;
		data[2] = v2;
	}
};

template &lt;typename T&gt;
struct gray{
	T intensity;
	gray(const T&amp; v=0) : intensity(v){}
};

template &lt;typename C&gt;
struct calc{
	int num_channels(const C&amp; color){
		return color.num_channels;
	}
};
template &lt;&gt;
struct calc&lt;gray&gt;{
	int num_channels(const gray&amp; color){
		return 1;
	}
};
</code></pre>
<p>Mein Problem tritt nun bei der Templatespezialisierung auf. Der Compiler mault da nämlich folgendermaßen rum:</p>
<blockquote>
<p>Fehler: Typ/Wert des Arguments 1 passt nicht in Template-Parameterliste für »template&lt;class C&gt; struct calc«<br />
Fehler: einen Typ erwartet, »gray« erhalten</p>
</blockquote>
<p>Leider seh ich den Fehler absolut nicht und wollte fragen, ob mir eventuell jemand weiter helfen kann.</p>
<p>Ich bedanke mich schon mal im Vorfeld für eure Antworten und verbleibe</p>
<p>Mit freundlichen Grüßen</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316337/problem-mit-traits</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 08:22:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316337.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 30 Apr 2013 06:29:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 06:29:12 GMT]]></title><description><![CDATA[<p>Hey @ all,<br />
ich beschäftige mich zur Zeit mit Templates in C++. Das ist mein Code</p>
<pre><code>template &lt;typename T&gt;
struct rgb{
	T data[3];
	static const int num_channels = 3;
	typedef T channel_value_type;
	rgb(){
		data[0]=data[1]=data[2]=(T)0;
	}

	rgb(const T&amp; v0, const T&amp; v1, const T&amp; v2){
		data[0] = v0;
		data[1] = v1;
		data[2] = v2;
	}
};

template &lt;typename T&gt;
struct gray{
	T intensity;
	gray(const T&amp; v=0) : intensity(v){}
};

template &lt;typename C&gt;
struct calc{
	int num_channels(const C&amp; color){
		return color.num_channels;
	}
};
template &lt;&gt;
struct calc&lt;gray&gt;{
	int num_channels(const gray&amp; color){
		return 1;
	}
};
</code></pre>
<p>Mein Problem tritt nun bei der Templatespezialisierung auf. Der Compiler mault da nämlich folgendermaßen rum:</p>
<blockquote>
<p>Fehler: Typ/Wert des Arguments 1 passt nicht in Template-Parameterliste für »template&lt;class C&gt; struct calc«<br />
Fehler: einen Typ erwartet, »gray« erhalten</p>
</blockquote>
<p>Leider seh ich den Fehler absolut nicht und wollte fragen, ob mir eventuell jemand weiter helfen kann.</p>
<p>Ich bedanke mich schon mal im Vorfeld für eure Antworten und verbleibe</p>
<p>Mit freundlichen Grüßen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319789</guid><dc:creator><![CDATA[DorJo]]></dc:creator><pubDate>Tue, 30 Apr 2013 06:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 06:55:51 GMT]]></title><description><![CDATA[<p>Der erste Template-Parameter von calc ist ein ein <strong>vollständiger Typ</strong>.</p>
<p><code>gray</code> ist aber kein <strong>vollständiger Typ</strong>, sondern ein <strong>Klassentemplate</strong>. Du musst wenn schon gray spezialisiert angeben:</p>
<pre><code>template &lt;&gt;
struct calc&lt;gray&lt;...&gt;&gt;
// ...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2319794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319794</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 30 Apr 2013 06:55:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 06:59:33 GMT]]></title><description><![CDATA[<p>Sone hat's schon gesagt ... übersetzen würde z.B.:</p>
<pre><code>template &lt;typename T&gt;
struct calc&lt;gray&lt;T&gt; &gt;{
    int num_channels(const gray&lt;T&gt;&amp; color){
        return 1;
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2319795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319795</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Tue, 30 Apr 2013 06:59:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 07:35:02 GMT]]></title><description><![CDATA[<p>Ahh, danke! Das war wohl zu offensichtlich! <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="😞"
    /><br />
Ich habe allerdings noch eine Folgefrage.<br />
Warum sagt der Compiler dann zu folgendem Code:</p>
<pre><code>template &lt;typename COLOR, typename TYPE&gt;
struct channel{
        TYPE get_channel(const COLOR&amp; color, int i){ 
                return color.data[i];
        }   
};

template &lt;typename TYPE&gt;
struct channel&lt;gray&lt;TYPE&gt; &gt;{
        TYPE get_channel(const gray&lt;TYPE&gt;&amp; color, int i){ 
                return color.intensity; 
        }   
};
</code></pre>
<blockquote>
<p>Fehler: für »template&lt;class COLOR, class TYPE&gt; struct channel« bereitgestellt<br />
Fehler: falsche Anzahl der Templateargumente (1, sollte 2 sein)</p>
</blockquote>
<p>Was mach ich denn falsch?</p>
<p>Mit freundlichen Grüßen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319800</guid><dc:creator><![CDATA[DorJo]]></dc:creator><pubDate>Tue, 30 Apr 2013 07:35:02 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 08:16:11 GMT]]></title><description><![CDATA[<p>DorJo schrieb:</p>
<blockquote>
<p>Was mach ich denn falsch?</p>
</blockquote>
<p>Du versuchst, <code>channel&lt;gray&lt;TYPE&gt; &gt;</code> zu spezialisieren, aber die Klasse gibt es gar nicht!</p>
<p>Aber <code>channel&lt;gray&lt;TYPE&gt;,TYPE&gt;</code> gibt es:</p>
<pre><code class="language-cpp">template &lt;typename TYPE&gt;
struct channel&lt;gray&lt;TYPE&gt;, TYPE&gt;{
        TYPE get_channel(const gray&lt;TYPE&gt;&amp; color, int i){ 
                return color.intensity; 
        }   
};
</code></pre>
<p>Falls dich das doppelte TYPE in der Nutzung stört, bleibt dir nichts anderes übrig als eine Helferfunktion zu schreiben</p>
<pre><code class="language-cpp">template &lt;typename T&gt; channel&lt;gray&lt;T&gt;, T&gt; make_channel(gray&lt;T&gt;)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2319811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319811</guid><dc:creator><![CDATA[ojrod]]></dc:creator><pubDate>Tue, 30 Apr 2013 08:16:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 08:25:58 GMT]]></title><description><![CDATA[<p>Tatsächlich kompiliert es jetzt! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> VIELEN VIELEN DANK!<br />
Und wie würde ich die Methode get_channel() jetzt aufrufen (Also für einen Gray)? Irgendwie verwirrt mich das alles noch. Kennt jemand vielleicht ein gutes Tutorial?</p>
<p>Mit freundlichen Grüßen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319815</guid><dc:creator><![CDATA[DorJo]]></dc:creator><pubDate>Tue, 30 Apr 2013 08:25:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 08:36:29 GMT]]></title><description><![CDATA[<blockquote>
<p>Kennt jemand vielleicht ein gutes Tutorial?</p>
</blockquote>
<p><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf</a></p>
<p>Kapitel 14 - Templates. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Spaß beiseite - hol dir ein gutes Grundlagenbuch.</p>
<blockquote>
<p>Und wie würde ich die Methode get_channel() jetzt aufrufen (Also für einen Gray)?</p>
</blockquote>
<p>Mit den entsprechenden Argumenten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319816</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 30 Apr 2013 08:36:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 08:44:50 GMT]]></title><description><![CDATA[<blockquote>
<p><a href="http://www.open-std.org/j" rel="nofollow">http://www.open-std.org/j</a> ....... ocs/papers/2012/n3337.pdf</p>
</blockquote>
<p>GEHT LOS! <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>
<pre><code>#include &quot;color.hpp&quot;                                                                                                                
#include &lt;iostream&gt;
int main(){
    gray&lt;int&gt; *a = new gray&lt;int&gt;();
    a-&gt;intensity = 10; 
    std::cout&lt;&lt;channel&lt;int&gt;::get_channel(*a,2)&lt;&lt;std::endl;
    delete a;
    return 0;
}
</code></pre>
<p>Das geht nicht! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Aber wie geht es dann? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319820</guid><dc:creator><![CDATA[DorJo]]></dc:creator><pubDate>Tue, 30 Apr 2013 08:44:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 08:46:40 GMT]]></title><description><![CDATA[<p>Welchen Code hast du denn jetzt genommen? Den von orjod?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319821</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 30 Apr 2013 08:46:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 08:49:22 GMT]]></title><description><![CDATA[<p>HAHA LOL! Sry, ja, das war ich. Hab mich beim Benutzernamen verschrieben! SORRYYY!!! Und ja, ich hab den Code genommen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319823</guid><dc:creator><![CDATA[DorJo]]></dc:creator><pubDate>Tue, 30 Apr 2013 08:49:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 08:51:03 GMT]]></title><description><![CDATA[<p>Halt stop, jetzt hab ich mich doch glatt verguggt! Also das hab ich nicht geschrieben. Aber ich habe den Code von ojrod genommen! Ich glaub ich sollte mal einen Kaffee trinken gehen um ein wenig runter zu kommen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319826</guid><dc:creator><![CDATA[DorJo]]></dc:creator><pubDate>Tue, 30 Apr 2013 08:51:03 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 12:43:17 GMT]]></title><description><![CDATA[<p>Also ich habe es jetzt mit viel Hilfe und noch leichtem Unverständniss gelöst bekommen.<br />
Falls es jemanden interessiert:</p>
<pre><code>template &lt;template&lt;typename&gt; class COLOR&gt;
struct is_gray{
    template&lt;typename TYPE&gt;
    static TYPE getValue(const COLOR&lt;TYPE&gt;&amp; color, int i)
    {
	return color.data[i];
    }
};

template &lt;&gt;
struct is_gray&lt;gray&gt;{
    template&lt;typename TYPE&gt;
    static TYPE getValue(const gray&lt;TYPE&gt;&amp; color, int i)
    {
	return color.intensity;
    }	
};

template &lt;template&lt;typename&gt; class COLOR, typename TYPE&gt;
TYPE get_channel(const COLOR&lt;TYPE&gt;&amp; color, int i){
    return is_gray&lt;COLOR&gt;::getValue(color, i);
}
</code></pre>
<p>Das nutzt jetzt, wenn mich nicht alles täuscht auch Traits-Klassen!</p>
<p>Mit freundlichen Grüßen<br />
DorJo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319872</guid><dc:creator><![CDATA[DorJo]]></dc:creator><pubDate>Tue, 30 Apr 2013 12:43:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 13:14:30 GMT]]></title><description><![CDATA[<p>Ein paar Anmerkungen:</p>
<pre><code class="language-cpp">struct rgb{ 
    T data[3]; 
    static const int num_channels = 3;
    ...

struct gray{
    ...
</code></pre>
<p>Warum hat <code>rgb</code> ein Member <code>num_channels</code> und <code>gray</code> nicht, wobei du nachtraeglich zwei Funktionen definierst, die genau diesen Umstand korrigieren. Einfach <code>num_channels</code> auch in <code>gray</code> definieren und 2 Funktionen/Strukturen gespart. Was spricht gegen <code>constexp</code> ?</p>
<pre><code class="language-cpp">int main(){ 
    gray&lt;int&gt; *a = new gray&lt;int&gt;(); 
    a-&gt;intensity = 10;
     std::cout&lt;&lt;channel&lt;int&gt;::get_channel(*a,2)&lt;&lt;std::endl; 
    delete a;
</code></pre>
<p><code>new</code> und <code>delete</code> in diesem Fall sind einfach verpoent. <code>gray&lt;int&gt;</code> einfach instantiieren ohne Heap ... schon wieder Zeilen gespart.</p>
<p>Beim Namen <code>is_gray</code> erwarte ich eine Funktion/Struktur, die mir angibt, ob die Farbe grau ist, d.h. irgendwie mit <code>bool</code> verknueft ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319876</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 30 Apr 2013 13:14:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 13:36:09 GMT]]></title><description><![CDATA[<p>wir dürfen an den structs nichts ändern, deswegen können wir in gray nicht einfach num_Channels hinzufügen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319883</guid><dc:creator><![CDATA[strawberry89]]></dc:creator><pubDate>Tue, 30 Apr 2013 13:36:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Traits on Tue, 30 Apr 2013 13:40:31 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Der erste Template-Parameter von calc ist ein ein <strong>vollständiger Typ</strong>.</p>
</blockquote>
<p>Das ist bloss ein Typ. Vollständig (complete) muss der - jedenfalls im gezeigten Code - nicht sein.</p>
<p>Wieso nicht einfach ein normales Funktionstemplate verwendet wird (statt Memberfunktion/-template), erschliesst sich mir nicht. So ist nur unnötig Redundanz drin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319885</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 30 Apr 2013 13:40:31 GMT</pubDate></item></channel></rss>