<?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: Exception bei nicht unterstütztem Typ]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Funktion die mir es erlaubt eine Variable vom big- zum litte endian Format zu konvertieren und andersrum.</p>
<p>Ich nutze dafür die entsprechenden Instruktionen. Daher existiert für jeden - möglichen - Typ eine Implementation:</p>
<pre><code class="language-cpp">template&lt;typename operand&gt;
operand bswap(
	operand 
) 
{
	assert(false);
	operand ret_val;
	return ret_val;

#ifdef _MSC_VER
#pragma message(&quot;Warning: implementation for specified operand type doesn't exist&quot;)
#endif
}

template&lt;&gt; uint16  bswap(uint16  value)	    {return Detail::bswap_word(value);}
template&lt;&gt; uint16&amp; bswap(uint16&amp; value)		{return Detail::bswap_word_ref(value);}
template&lt;&gt; uint32  bswap(uint32  value)		{return Detail::bswap_dword(value);}
template&lt;&gt; uint32&amp; bswap(uint32&amp; value)		{return Detail::bswap_dword_ref(value);}
template&lt;&gt; uint64  bswap(uint64  value)	    {return Detail::bswap_qword(value);}
template&lt;&gt; uint64&amp; bswap(uint64&amp; value)		{return Detail::bswap_qword_ref(value);}
</code></pre>
<p>Ist die non-specialized template Funktion - die bei allen anderen Typen aufgerufen wird - so in Ordnung oder sollte man das anders machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/258126/template-exception-bei-nicht-unterstütztem-typ</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 14:55:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258126.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 06 Jan 2010 21:39:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template: Exception bei nicht unterstütztem Typ on Wed, 06 Jan 2010 21:41:24 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Funktion die mir es erlaubt eine Variable vom big- zum litte endian Format zu konvertieren und andersrum.</p>
<p>Ich nutze dafür die entsprechenden Instruktionen. Daher existiert für jeden - möglichen - Typ eine Implementation:</p>
<pre><code class="language-cpp">template&lt;typename operand&gt;
operand bswap(
	operand 
) 
{
	assert(false);
	operand ret_val;
	return ret_val;

#ifdef _MSC_VER
#pragma message(&quot;Warning: implementation for specified operand type doesn't exist&quot;)
#endif
}

template&lt;&gt; uint16  bswap(uint16  value)	    {return Detail::bswap_word(value);}
template&lt;&gt; uint16&amp; bswap(uint16&amp; value)		{return Detail::bswap_word_ref(value);}
template&lt;&gt; uint32  bswap(uint32  value)		{return Detail::bswap_dword(value);}
template&lt;&gt; uint32&amp; bswap(uint32&amp; value)		{return Detail::bswap_dword_ref(value);}
template&lt;&gt; uint64  bswap(uint64  value)	    {return Detail::bswap_qword(value);}
template&lt;&gt; uint64&amp; bswap(uint64&amp; value)		{return Detail::bswap_qword_ref(value);}
</code></pre>
<p>Ist die non-specialized template Funktion - die bei allen anderen Typen aufgerufen wird - so in Ordnung oder sollte man das anders machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833984</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 06 Jan 2010 21:41:24 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Exception bei nicht unterstütztem Typ on Wed, 06 Jan 2010 21:46:29 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#ifdef _MSC_VER 
#pragma message(&quot;Warning: implementation for specified operand type doesn't exist&quot;) 
#endif
</code></pre>
<p>sollte immer ausgelöst werden.. woher soll denn der präprozessor wissen, ob das template instantiiert wird oder nicht? er sieht es -&gt; er warnt!</p>
<p>bb</p>
<p>edit:<br />
ich würds so machen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
T endian_swap(T val); //LNK-error

template&lt;&gt;
T endian_swap&lt;short&gt;(short val)
{
  return detail::short_swap(val);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1833987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833987</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 06 Jan 2010 21:46:29 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Exception bei nicht unterstütztem Typ on Wed, 06 Jan 2010 21:47:35 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#ifdef _MSC_VER 
#pragma message(&quot;Warning: implementation for specified operand type doesn't exist&quot;) 
#endif
</code></pre>
<p>sollte immer ausgelöst werden.. woher soll denn der präprozessor wissen, ob das template instantiiert wird oder nicht? er sieht es -&gt; er warnt!</p>
<p>bb</p>
</blockquote>
<p>Nein, mit Sicherheit nicht.<br />
Es wird nur ausgelöst, wenn eine unspecialized operand type Variante instantiiert (verwendet) wird.</p>
<p>Es ist ja der Sinn eines Templates, dass erst zur Kompilierzeit die eigentliche Klasse / Struct / Funktion angelegt wird.<br />
Soll heißen: Bevor man (z.B.) bswap&lt;double&gt; nicht verwendet existiert es auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833992</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 06 Jan 2010 21:47:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Exception bei nicht unterstütztem Typ on Wed, 06 Jan 2010 21:51:19 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<pre><code class="language-cpp">ich würds so machen:
[cpp]
template&lt;typename T&gt;
T endian_swap(T val); //LNK-error

template&lt;&gt;
T endian_swap&lt;short&gt;(short val)
{
  return detail::short_swap(val);
}
</code></pre>
</blockquote>
<p>Ja, stimmt schon. Ist zwar die Primitivste, aber eine definitiv funktionierende Lösung.<br />
Ich dachte nur, es wäre schön, etwas mehr Feedback zu geben. Ist zwar im Endeffekt von vornherein Quatsch bswap für etwas anderes zu benutzten, aber man weiß ja nie <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>Dachte es gibt vielleicht die Möglichkeit - jetzt MSC spezifisch - eine echte Warnung auszugeben.<br />
Der per message() erscheinende Text ist da nicht wirklich nützlich, da das im Output-Fenster sowie jeder übersieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833995</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 06 Jan 2010 21:51:19 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Exception bei nicht unterstütztem Typ on Wed, 06 Jan 2010 21:51:29 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Nein, mit Sicherheit nicht.</p>
</blockquote>
<p>Doch. Der Präprozessor funktioniert ganz anders als du dir das offenbar vorstellst. Du kannst aber Compilezeitassertions mit Meldungen machen, guck die mal die Boost Metaprogrammierungsbibliotheken an, die müssten sowas haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833996</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 06 Jan 2010 21:51:29 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Exception bei nicht unterstütztem Typ on Wed, 06 Jan 2010 21:58:58 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Doch. Der Präprozessor funktioniert ganz anders als du dir das offenbar vorstellst. Du kannst aber Compilezeitassertions mit Meldungen machen, guck die mal die Boost Metaprogrammierungsbibliotheken an, die müssten sowas haben.</p>
</blockquote>
<p>Ich würd's ja gerne glauben, aber warum funktioniert es dann?!</p>
<p>Verwende ich im Code:</p>
<pre><code class="language-cpp">bswap&lt;double&gt;(8.0);
</code></pre>
<p>kommt meine Meldung. Kommentiere ich es aus, dann nicht. Also genau das was ich wollte ...</p>
<p>Ich bin mir durchaus im klaren darüber, wie der Präprozessor funktioniert. Ich gehe sogar fest davon aus, dass selbige Deklaration mit gcc nicht funktionieren würde (sehen wir mal von der sowieso nicht vorhanden Direktive ab).</p>
<p>Mir ist klar, dass das mal wieder eine MSC-only Geschichte ist, aber andere Compiler grenze ich ja sowieso aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833998</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 06 Jan 2010 21:58:58 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Exception bei nicht unterstütztem Typ on Wed, 06 Jan 2010 22:02:47 GMT]]></title><description><![CDATA[<p>hmm.. also zumindest der msvc scheint sich da nicht ganz korrekt zu verhalten:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void t(T)
{
#  pragma message(&quot;hi&quot;)
}

template&lt;&gt; void t(int) {}

int main()
{
  ; //keine msg
//  t(int()); //keine msg
//  t(float()); //msg
}
</code></pre>
<p>sehr eigenartig...<br />
aber imho definitiv nicht standard-konform...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833999</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 06 Jan 2010 22:02:47 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Exception bei nicht unterstütztem Typ on Wed, 06 Jan 2010 22:06:04 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>sehr eigenartig...<br />
aber imho definitiv nicht standard-konform...<br />
bb</p>
</blockquote>
<p>Sag ich doch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Was ist beim MSC schon wirklich Standard? Alles andere hab ich ja auch ausgeschaltet, aber wenn es statt message kein warning Pendandt gibt, ist die Lösung das Ding einfach nicht zu definieren und den Linker die Arbeit machen zu lassen, wohl am einfachsten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834002</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 06 Jan 2010 22:06:04 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Exception bei nicht unterstütztem Typ on Wed, 06 Jan 2010 22:16:26 GMT]]></title><description><![CDATA[<p>schau mal nach boost::enable_if und ähnlichem. Das könnte auch helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834005</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 06 Jan 2010 22:16:26 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Exception bei nicht unterstütztem Typ on Thu, 07 Jan 2010 01:18:13 GMT]]></title><description><![CDATA[<p>also ehrlich ich verstehe das problem nicht.<br />
wenn man die default-implementierung weglässt, wird ein compiler-FEHLER erzeugt. besser geht's ja wohl nicht.</p>
<p>wieso sollte man jetzt krampfhaft versuchen dieses verhalten zu verschlechtern, indem man aus dem FEHLER einen leicht zu übersehenden hinweis macht?!?</p>
<p>BTW: jeder C++ programmierer mit ein wenig erfahrung wird sofort verstehen was es bedeutet, wenn der compiler hier rumsudert dass er das template nicht instanzieren kann. die verständlichkeit ist IMO also auch kein argument.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834058</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 07 Jan 2010 01:18:13 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Exception bei nicht unterstütztem Typ on Thu, 07 Jan 2010 06:40:56 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>wenn man die default-implementierung weglässt, wird ein compiler-FEHLER erzeugt. besser geht's ja wohl nicht.</p>
</blockquote>
<p>Wie machst du das? Ich bekomm nur nen Linkererror.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834097</guid><dc:creator><![CDATA[howto]]></dc:creator><pubDate>Thu, 07 Jan 2010 06:40:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Exception bei nicht unterstütztem Typ on Thu, 07 Jan 2010 08:25:27 GMT]]></title><description><![CDATA[<p>Das Template undefiniert zu lassen führt - wenn es verwendet wird - im günstigsten Fall zu einem Linkerfehler, weil keine Instantiierung stattgefunden hat (die Suche nach Fehlerstelle dauert dann ein paar Stunden).<br />
Ein assert/abort o.ä. führt erst zum Abbruch bei der Programmausführung (der Fehler wird dann irgendwann zuerst durch den Kunden entdeckt, bzw. gar nicht, weil keine Debugbuilds ausgeliefert werden).<br />
Wird die Menge der möglichen Templateargumente per SFINAE ausreichend eingeschränkt, erhält man sofort beim Compilieren eine Diagnose, die allerdings jenach Compiler irreführend sein kann - zudem zudem führt es zu Duplizität im Code, weil die Typen, für die spezialisiert wird, vorweggenommen werden.<br />
Ist der Code des Templates derart, dass eine Instantiierung nicht möglich ist, tritt der Fehler ebenfalls beim Compilieren auf und man hat die möglichkeit, mit ein bisschen Compiler-Magie die Fehlermeldung lesbar zu gestalten.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
T endian_swap(T val)
{
    BOOST_STATIC_ASSERT( false &amp;&amp; &quot;not implemented for this type&quot; );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1834120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834120</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 07 Jan 2010 08:25:27 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Exception bei nicht unterstütztem Typ on Thu, 07 Jan 2010 09:22:36 GMT]]></title><description><![CDATA[<p>OK, dann Linker-Fehler.<br />
Auf jeden Fall besser als eine einfache Meldung + Programm compiliert + linkt + baut dann aber scheisse wenn man es startet.</p>
<p>static_assert() ist natürlich auch eine Möglichkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834142</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 07 Jan 2010 09:22:36 GMT</pubDate></item></channel></rss>