<?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[spaß mit vererbung]]></title><description><![CDATA[<p>Fehlermeldung</p>
<pre><code>error C2784: 'bool operator &lt;(const ccomparable&lt;t&gt; &amp;,const t &amp;)' : could not deduce template argument for 'const ccomparable&lt;t&gt; &amp;' from 'const cmonomial&lt;tresult,targument&gt;'
        with
        [
            tresult=float,
            targument=float
        ]
        d:\programmierung\vc++ 2005 express edition\bin\base classes\comparable.h(25) : see declaration of 'operator &lt;'
</code></pre>
<p>dazu folgender C++ Codeausschnitt</p>
<pre><code class="language-cpp">template&lt;class t&gt;
class ccomparable
{
	public:
		virtual int compare(t const &amp;src) const = 0;
//...
};

template&lt;class t&gt;
bool operator &lt; (ccomparable&lt;t&gt; const &amp;lhs, t const &amp;rhs)
{
  return lhs.compare(rhs) &lt; 0;
};

template&lt;class tresult, class targument&gt;
class cmonomial :
	virtual public ccomparable&lt;cmonomial&lt;tresult, targument&gt;&gt;
{
	public:
		int compare(cmonomial&lt;tresult, targument&gt; const &amp;src) const;
//...
};

int main()
{
  cmonomial&lt;float, float&gt; m1, m2;
  bool less = false;
  less = (m1 &lt; m2); // hier kommt die opbige fehlermeldung
  return 0;
};
</code></pre>
<p>ich versteh halt nicht wo das problem ist, aber vllt hab ich da was mit der vererbung nicht richtig verstanden.<br />
danke schon mal im voraus für ratschläge zum lösen des problems.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/206026/spaß-mit-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 01:00:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206026.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 20 Feb 2008 14:28:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to spaß mit vererbung on Wed, 20 Feb 2008 14:28:44 GMT]]></title><description><![CDATA[<p>Fehlermeldung</p>
<pre><code>error C2784: 'bool operator &lt;(const ccomparable&lt;t&gt; &amp;,const t &amp;)' : could not deduce template argument for 'const ccomparable&lt;t&gt; &amp;' from 'const cmonomial&lt;tresult,targument&gt;'
        with
        [
            tresult=float,
            targument=float
        ]
        d:\programmierung\vc++ 2005 express edition\bin\base classes\comparable.h(25) : see declaration of 'operator &lt;'
</code></pre>
<p>dazu folgender C++ Codeausschnitt</p>
<pre><code class="language-cpp">template&lt;class t&gt;
class ccomparable
{
	public:
		virtual int compare(t const &amp;src) const = 0;
//...
};

template&lt;class t&gt;
bool operator &lt; (ccomparable&lt;t&gt; const &amp;lhs, t const &amp;rhs)
{
  return lhs.compare(rhs) &lt; 0;
};

template&lt;class tresult, class targument&gt;
class cmonomial :
	virtual public ccomparable&lt;cmonomial&lt;tresult, targument&gt;&gt;
{
	public:
		int compare(cmonomial&lt;tresult, targument&gt; const &amp;src) const;
//...
};

int main()
{
  cmonomial&lt;float, float&gt; m1, m2;
  bool less = false;
  less = (m1 &lt; m2); // hier kommt die opbige fehlermeldung
  return 0;
};
</code></pre>
<p>ich versteh halt nicht wo das problem ist, aber vllt hab ich da was mit der vererbung nicht richtig verstanden.<br />
danke schon mal im voraus für ratschläge zum lösen des problems.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459491</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Wed, 20 Feb 2008 14:28:44 GMT</pubDate></item><item><title><![CDATA[Reply to spaß mit vererbung on Wed, 20 Feb 2008 14:42:29 GMT]]></title><description><![CDATA[<p>const ccomparable&lt;t&gt; &amp; ist ein deduzierbarer Kontext, dass heißt, für ein gegebenes Argument, kann der Templateparameter t aus diesem Argument prinzipiell bestimmt werden.<br />
in m1 &lt; m2 ist der linke Operand vom Typ cmonomial&lt;float, float&gt;, das ist keine Instanz des Templates ccomparable, mithin kann für dieses Funktionsargument der Templateparameter T nicht deduziert, und damit der tatsächliche Funktionsparameter substituiert werden. Das ist also ein Fall für SFINAE - streng genommen besteht der Fehler nicht darin, dass das Templateargument nicht ermittelt werden kann, sondern darin, dass keine geeignete Überladung übrigbleibt - das wäre aber wohl nicht so hilfreich für den Programmier.</p>
<p>Was du zu beabsichtigen scheinst ist etwas anderes: das linke Argument soll nur in ein geeignetes ccomparable&lt;t&gt; konvertierbar sein - dass bedeutet, dass für dieses Argument keine Templateparameterdeduktion stattfinden darf (denn dies unterdrück alle Konvertierungen für dieses Argument außer ggf. Qualifikationskonvertierung). Der Trick muss daher darin bestehen, den Typ zwar als ccomparable&lt;t&gt; zu bestimmen, aber diesen in einen nicht deduzierbaren Kontext zu setzen: klassisch ist TT&lt;T&gt;::X so ein Fall:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; struct identity { typedef T type; }; // Hilfstemplate
template&lt;class t&gt;
bool operator &lt; (typename identity&lt;ccomparable&lt;t&gt; &gt;::type const &amp;lhs, t const &amp;rhs)
{
  return lhs.compare(rhs) &lt; 0;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1459504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459504</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 20 Feb 2008 14:42:29 GMT</pubDate></item><item><title><![CDATA[Reply to spaß mit vererbung on Wed, 20 Feb 2008 15:07:14 GMT]]></title><description><![CDATA[<p>also so ganz versteh ich das nicht, meine cmonomial-klasse ist doch von ccomparable abgeleitet und müsste doch dann auch auf diesem operator anspringen.</p>
<p>mal abgesehen davon gibts vllt noch ein weiteres problem mit der externen deklaration des operators &lt;.</p>
<pre><code class="language-cpp">class A :virtual public ccomparable&lt;int&gt;
{
//...
};

class B :virtual public ccomparable&lt;int&gt;
{
//...
};
</code></pre>
<p>dann hätte ich doch rein theoretisch zweimal</p>
<pre><code class="language-cpp">bool operator &lt; (ccomparable&lt;int&gt; const &amp;lhs, int const &amp;rhs);
</code></pre>
<p>deklariert oder der compiler weiß dann nicht welchen er nehmen soll, obwohl das eigentlich klar ist, jenachdem welcher typ auf ccomparable reduziert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459530</guid><dc:creator><![CDATA[StarCraftFeuerteufel]]></dc:creator><pubDate>Wed, 20 Feb 2008 15:07:14 GMT</pubDate></item></channel></rss>