<?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[Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden?]]></title><description><![CDATA[<p>Hallo,<br />
vor zwei Wochen habe ich zum Lernen wie man die vier Rechenoperatoren überlädt mit dem Programmieren einer Matrizenklasse begonnen.<br />
Unter gcc (g++) funktionieren alle Rechenoperationen (+,-,<em>,/) wunderbar.<br />
Ich kann sogar ein lineares Gleichungssystem M</em>X = Y mittels überladenem<br />
/ Operator lösen: X = Y / M (hinter dem / habe ich den Gaussalgorithmus programmiert).</p>
<p>Wie gesagt, das funktioniert mit gcc.</p>
<p>Nun wollte ich die Klasse mit dem Testprogramm, mit dem ich die Matrizenoperationen teste,<br />
auch mit MS Visual Studio 2005 testen. Dabei treten jedoch in den Quellcodezeilen 68<br />
und 84 mir unerkärliche Compile-Fehler auf. Ich habe beide Zeilen unten im Quellcode markiert. Merkwürdig ist auch, dass in Zeile<br />
68 der - und in Zeile 84 + Operator steht, also nicht der + bzw. der * Operator, auf die sich die Fehlermeldungen beziehen. Im Listing unten sind es die Zeilennummern 51 und 68. Ich habe diese Überladungen ja für alle 4 Operatoren definiert, jedoch werden nur bei 2 Operatoren Fehlermeldungen ausgegeben. Was habe ich hier falsch gemacht?</p>
<p>Kann mir irgend jemand helfen? Ich bin für jeden Tipp dankbar.</p>
<p>vg. tesu</p>
<p>ps: Mit dieser Klasse möchte ich meine Programmierkenntnisse verbessern, insbesondere<br />
Überladen von Operationen. Falls ihr in der folgenden Klassendefinition prinzipielle<br />
Fehler entdeckt, bitte um Hinweise. Ich bin mir auch gar nicht im klaren,<br />
warum ich bei friend Definition dieses<br />
Ungetüm: friend matrix&lt;T&gt; (::operator * &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m ) schreiben<br />
muss, ohne (::operator * &lt;&gt;) funktionierts nicht.</p>
<h1>Hier die Fehlermeldungen und der Code der Klasse (ohne Implementierung)</h1>
<p>Fehler in Zeile 68:</p>
<p>Fehler 1 error C2783: &quot;matrix&lt;T&gt; operator +(const T,const matrix&lt;T&gt; &amp;)&quot;:<br />
template-Argument für &quot;T&quot; konnte nicht hergeleitet werden.<br />
matrix.h 68</p>
<p>Fehler in Zeile 84:</p>
<p>Fehler 2 error C2783: &quot;matrix&lt;T&gt; operator *(const T,const matrix&lt;T&gt; &amp;)&quot;:<br />
template-Argument für &quot;T&quot; konnte nicht hergeleitet werden.<br />
matrix.h 84</p>
<pre><code class="language-cpp">#include &quot;mave.h&quot;  // Basisklasse mit elementaren Vektor/Matrizen-Operationen

// Immportant forward declarations to avoid odd warnings and linking errors!
template&lt;class T&gt; class matrix;
template&lt;class T&gt; matrix&lt;T&gt; operator + (const T c, const matrix&lt;T&gt;&amp; m );
template&lt;class T&gt; matrix&lt;T&gt; operator - (const T c, const matrix&lt;T&gt;&amp; m );
template&lt;class T&gt; matrix&lt;T&gt; operator * (const T c, const matrix&lt;T&gt;&amp; m );

template &lt;typename T&gt; class matrix : public mave&lt;T&gt;
{
 public:

   // constructors
   matrix&lt;T&gt; (unsigned row) : mave&lt;T&gt;(row){rangk=-1;}
   matrix&lt;T&gt; (unsigned row, unsigned col) : mave&lt;T&gt;(row, col){rangk=-1;}
   matrix&lt;T&gt; (int rowl, int rowh, int coll, int colh) 
	      : mave&lt;T&gt;(rowl, rowh, coll, colh){rangk=-1;}

   // copy constructor
   matrix&lt;T&gt; (const mave&lt;T&gt;&amp; m) : mave&lt;T&gt;(m){rangk=-1;}
   matrix&lt;T&gt; (const matrix&lt;T&gt;&amp; m) : mave&lt;T&gt;(m){rangk=-1;}

   // ~ operator 
   matrix&lt;T&gt; operator ~(){return matrix&lt;T&gt;(mave&lt;T&gt;::operator ~(/*-:)*/));}

   // assignment operators 
   matrix&lt;T&gt;&amp; operator  = (const T s);
   matrix&lt;T&gt;&amp; operator  = (const matrix&lt;T&gt;&amp; m);

   // numeric assignment operators
   matrix&lt;T&gt; operator += (T s);
   matrix&lt;T&gt; operator -= (T s);
   matrix&lt;T&gt; operator *= (T s);
   matrix&lt;T&gt; operator /= (T s);
   matrix&lt;T&gt; operator += (const matrix&lt;T&gt;&amp; m);
   matrix&lt;T&gt; operator -= (const matrix&lt;T&gt;&amp; m);
   matrix&lt;T&gt; operator *= (const matrix&lt;T&gt;&amp; m);

   // unary operators
   matrix&lt;T&gt; operator + ();   // does nothing, yet satisfies true completeness
   matrix&lt;T&gt; operator - ();   // changes signs of all components
   matrix&lt;T&gt; operator ! ();   // inverse of matrix

   // binary operators
   // add scalar to components
   matrix&lt;T&gt; operator + (const T c);
   friend matrix&lt;T&gt; (::operator + &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

// &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; Zeile 68
   // sub scalar from components                       
   matrix&lt;T&gt; operator - (const T c);

   // sub components from const scalar
   friend matrix&lt;T&gt; (::operator - &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

   // mult all matrix components by scalar c
   matrix&lt;T&gt; operator * (const T c);
   friend matrix&lt;T&gt; (::operator * &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

   // div all matrix components by scalar c
   matrix&lt;T&gt; operator / (const T c);

   // matrix to power p, a^p   (a*a...*a, p-times)
   matrix&lt;T&gt; operator ^ (unsigned int p);

   // add, sub two matrices (i,j) op (i,j)--&gt;(i,j)
// &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; Zeile 84
   matrix&lt;T&gt; operator + (const matrix&lt;T&gt;&amp; rm);         
   matrix&lt;T&gt; operator - (const matrix&lt;T&gt;&amp; rm);

   // mult matrix by matrix (i,j)*(j,k)--&gt;(i,k)
   matrix&lt;T&gt; operator * (const matrix&lt;T&gt;&amp; rm);

   // solve set of linear equations, Mx=r --&gt; x = r / M  or x = r % M
   matrix&lt;T&gt; operator / (const matrix&lt;T&gt;&amp; m);
   friend matrix&lt;T&gt; operator % (const matrix&lt;T&gt;&amp; r, const matrix&lt;T&gt;&amp; m ){return r/m;}

// . . . (noch weitere Matrizenfunktionen, lineare Gleichungen)
};
</code></pre>
<p>Vielen Dank für eure Hilfe!<br />
tesu</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/182721/operator-template-argument-für-quot-t-quot-konnte-nicht-hergeleitet-werden</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 01:44:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182721.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 May 2007 15:03:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Mon, 28 May 2007 15:03:11 GMT]]></title><description><![CDATA[<p>Hallo,<br />
vor zwei Wochen habe ich zum Lernen wie man die vier Rechenoperatoren überlädt mit dem Programmieren einer Matrizenklasse begonnen.<br />
Unter gcc (g++) funktionieren alle Rechenoperationen (+,-,<em>,/) wunderbar.<br />
Ich kann sogar ein lineares Gleichungssystem M</em>X = Y mittels überladenem<br />
/ Operator lösen: X = Y / M (hinter dem / habe ich den Gaussalgorithmus programmiert).</p>
<p>Wie gesagt, das funktioniert mit gcc.</p>
<p>Nun wollte ich die Klasse mit dem Testprogramm, mit dem ich die Matrizenoperationen teste,<br />
auch mit MS Visual Studio 2005 testen. Dabei treten jedoch in den Quellcodezeilen 68<br />
und 84 mir unerkärliche Compile-Fehler auf. Ich habe beide Zeilen unten im Quellcode markiert. Merkwürdig ist auch, dass in Zeile<br />
68 der - und in Zeile 84 + Operator steht, also nicht der + bzw. der * Operator, auf die sich die Fehlermeldungen beziehen. Im Listing unten sind es die Zeilennummern 51 und 68. Ich habe diese Überladungen ja für alle 4 Operatoren definiert, jedoch werden nur bei 2 Operatoren Fehlermeldungen ausgegeben. Was habe ich hier falsch gemacht?</p>
<p>Kann mir irgend jemand helfen? Ich bin für jeden Tipp dankbar.</p>
<p>vg. tesu</p>
<p>ps: Mit dieser Klasse möchte ich meine Programmierkenntnisse verbessern, insbesondere<br />
Überladen von Operationen. Falls ihr in der folgenden Klassendefinition prinzipielle<br />
Fehler entdeckt, bitte um Hinweise. Ich bin mir auch gar nicht im klaren,<br />
warum ich bei friend Definition dieses<br />
Ungetüm: friend matrix&lt;T&gt; (::operator * &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m ) schreiben<br />
muss, ohne (::operator * &lt;&gt;) funktionierts nicht.</p>
<h1>Hier die Fehlermeldungen und der Code der Klasse (ohne Implementierung)</h1>
<p>Fehler in Zeile 68:</p>
<p>Fehler 1 error C2783: &quot;matrix&lt;T&gt; operator +(const T,const matrix&lt;T&gt; &amp;)&quot;:<br />
template-Argument für &quot;T&quot; konnte nicht hergeleitet werden.<br />
matrix.h 68</p>
<p>Fehler in Zeile 84:</p>
<p>Fehler 2 error C2783: &quot;matrix&lt;T&gt; operator *(const T,const matrix&lt;T&gt; &amp;)&quot;:<br />
template-Argument für &quot;T&quot; konnte nicht hergeleitet werden.<br />
matrix.h 84</p>
<pre><code class="language-cpp">#include &quot;mave.h&quot;  // Basisklasse mit elementaren Vektor/Matrizen-Operationen

// Immportant forward declarations to avoid odd warnings and linking errors!
template&lt;class T&gt; class matrix;
template&lt;class T&gt; matrix&lt;T&gt; operator + (const T c, const matrix&lt;T&gt;&amp; m );
template&lt;class T&gt; matrix&lt;T&gt; operator - (const T c, const matrix&lt;T&gt;&amp; m );
template&lt;class T&gt; matrix&lt;T&gt; operator * (const T c, const matrix&lt;T&gt;&amp; m );

template &lt;typename T&gt; class matrix : public mave&lt;T&gt;
{
 public:

   // constructors
   matrix&lt;T&gt; (unsigned row) : mave&lt;T&gt;(row){rangk=-1;}
   matrix&lt;T&gt; (unsigned row, unsigned col) : mave&lt;T&gt;(row, col){rangk=-1;}
   matrix&lt;T&gt; (int rowl, int rowh, int coll, int colh) 
	      : mave&lt;T&gt;(rowl, rowh, coll, colh){rangk=-1;}

   // copy constructor
   matrix&lt;T&gt; (const mave&lt;T&gt;&amp; m) : mave&lt;T&gt;(m){rangk=-1;}
   matrix&lt;T&gt; (const matrix&lt;T&gt;&amp; m) : mave&lt;T&gt;(m){rangk=-1;}

   // ~ operator 
   matrix&lt;T&gt; operator ~(){return matrix&lt;T&gt;(mave&lt;T&gt;::operator ~(/*-:)*/));}

   // assignment operators 
   matrix&lt;T&gt;&amp; operator  = (const T s);
   matrix&lt;T&gt;&amp; operator  = (const matrix&lt;T&gt;&amp; m);

   // numeric assignment operators
   matrix&lt;T&gt; operator += (T s);
   matrix&lt;T&gt; operator -= (T s);
   matrix&lt;T&gt; operator *= (T s);
   matrix&lt;T&gt; operator /= (T s);
   matrix&lt;T&gt; operator += (const matrix&lt;T&gt;&amp; m);
   matrix&lt;T&gt; operator -= (const matrix&lt;T&gt;&amp; m);
   matrix&lt;T&gt; operator *= (const matrix&lt;T&gt;&amp; m);

   // unary operators
   matrix&lt;T&gt; operator + ();   // does nothing, yet satisfies true completeness
   matrix&lt;T&gt; operator - ();   // changes signs of all components
   matrix&lt;T&gt; operator ! ();   // inverse of matrix

   // binary operators
   // add scalar to components
   matrix&lt;T&gt; operator + (const T c);
   friend matrix&lt;T&gt; (::operator + &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

// &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; Zeile 68
   // sub scalar from components                       
   matrix&lt;T&gt; operator - (const T c);

   // sub components from const scalar
   friend matrix&lt;T&gt; (::operator - &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

   // mult all matrix components by scalar c
   matrix&lt;T&gt; operator * (const T c);
   friend matrix&lt;T&gt; (::operator * &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

   // div all matrix components by scalar c
   matrix&lt;T&gt; operator / (const T c);

   // matrix to power p, a^p   (a*a...*a, p-times)
   matrix&lt;T&gt; operator ^ (unsigned int p);

   // add, sub two matrices (i,j) op (i,j)--&gt;(i,j)
// &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; Zeile 84
   matrix&lt;T&gt; operator + (const matrix&lt;T&gt;&amp; rm);         
   matrix&lt;T&gt; operator - (const matrix&lt;T&gt;&amp; rm);

   // mult matrix by matrix (i,j)*(j,k)--&gt;(i,k)
   matrix&lt;T&gt; operator * (const matrix&lt;T&gt;&amp; rm);

   // solve set of linear equations, Mx=r --&gt; x = r / M  or x = r % M
   matrix&lt;T&gt; operator / (const matrix&lt;T&gt;&amp; m);
   friend matrix&lt;T&gt; operator % (const matrix&lt;T&gt;&amp; r, const matrix&lt;T&gt;&amp; m ){return r/m;}

// . . . (noch weitere Matrizenfunktionen, lineare Gleichungen)
};
</code></pre>
<p>Vielen Dank für eure Hilfe!<br />
tesu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293824</guid><dc:creator><![CDATA[tesuji]]></dc:creator><pubDate>Mon, 28 May 2007 15:03:11 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Mon, 28 May 2007 15:51:36 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>mache mal aus deinem komischen friend so und implementiere sie auch gleich in der .h:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; class matrix : public mave&lt;T&gt;
{
 public:
// ...
friend matrix&lt;T&gt;::operator(const T c, const matrix&lt;T&gt;&amp; m )
{
  //imp.
}
// ...
}
</code></pre>
<p>Siehe hier: <a href="http://c-plusplus.net/forum/viewtopic-var-p-is-1210246.html#1210246" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-p-is-1210246.html#1210246</a> Ab da mal lesen. Hoffe mal das das, dass Problem behebt ...</p>
<p>Edit: Bissl weiter unten erklärt es camper nochmal genau <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293870</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 28 May 2007 15:51:36 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Mon, 28 May 2007 16:43:54 GMT]]></title><description><![CDATA[<p>Vielen Dank KasF,</p>
<p>so wie du es schreibst, hatte ich es auch zuerst unter MSVSc++ programmiert, (wie in deinem Link habe ich cout, &lt;&lt;, &gt;&gt; auch noch überladen, das klappt bei MSVSc++ und gcc/c++.)</p>
<p>Der folgende Code funktioniert mit MS Visual Studio 2005 aber er funktioniert nicht mit gcc/c++ (wxDev-C++ 6.10-2):</p>
<pre><code class="language-cpp">// add scalar to components
   matrix&lt;T&gt; operator + (const T c);
   friend matrix&lt;T&gt; operator + (const T c, const matrix&lt;T&gt;&amp; m );
   //// friend matrix&lt;T&gt; (::operator + &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

   // sub scalar from components
   matrix&lt;T&gt; operator - (const T c);					          
   // sub components from const scalar
   friend matrix&lt;T&gt;  operator - (const T c, const matrix&lt;T&gt;&amp; m );
   //// friend matrix&lt;T&gt; (::operator - &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

   // mult all matrix components by scalar c
   matrix&lt;T&gt; operator * (const T c);
   friend matrix&lt;T&gt; operator * (const T c, const matrix&lt;T&gt;&amp; m );
   //// friend matrix&lt;T&gt; (::operator * &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

Meldungen bei gcc/c++ (wxDev-C++ 6.10-2):  

 Warnungen:  
   65 D:\Programming\000-devcpp\matrix.h [Warning] friend declaration `matrix&lt;T&gt; 
   operator+(T, const matrix&lt;T&gt;&amp;)' declares a non-template function 
   65 D:\Programming\000-devcpp\matrix.h [Warning] (if this is not what you intended, 
   make sure the function template has already been declared and add &lt;&gt; after the 
   function name here) -Wno-non-template-friend disables this warning 

Fehler:   
   [Linker Error] undefined reference to `operator*(double, matrix&lt;double&gt; const&amp;)' 
   [Linker Error] undefined reference to `operator*(double, matrix&lt;double&gt; const&amp;)' 
   [Linker Error] undefined reference to `operator-(double, matrix&lt;double&gt; const&amp;)' 
   [Linker Error] undefined reference to `operator*(double, matrix&lt;double&gt; const&amp;)' 
   [Linker Error] undefined reference to `operator+(double, matrix&lt;double&gt; const&amp;)'
</code></pre>
<p>Der folgende Code funktioniert mit gcc/c++ (wxDev-C++ 6.10-2) aber er funktioniert nicht mit MS Visual Studio 2005 :</p>
<pre><code class="language-cpp">// add scalar to components
   matrix&lt;T&gt; operator + (const T c);
   //// friend matrix&lt;T&gt; operator + (const T c, const matrix&lt;T&gt;&amp; m );
   friend matrix&lt;T&gt; (::operator + &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

   // sub scalar from components
   matrix&lt;T&gt; operator - (const T c);

   // sub components from const scalar
   //// friend matrix&lt;T&gt; operator - (const T c, const matrix&lt;T&gt;&amp; m );
   friend matrix&lt;T&gt; (::operator - &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

   // mult all matrix components by scalar c
   matrix&lt;T&gt; operator * (const T c);
   //// friend matrix&lt;T&gt; operator * (const T c, const matrix&lt;T&gt;&amp; m );
   friend matrix&lt;T&gt; (::operator * &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

Fehlermeldungen MS Visual Studio 2005:

Fehler	1	error C2783: &quot;matrix&lt;T&gt; operator +(const T,const matrix&lt;T&gt; &amp;)&quot;:
template-Argument für &quot;T&quot; konnte nicht hergeleitet werden. matrix.h	69

Fehler	2	error C2783: &quot;matrix&lt;T&gt; operator *(const T,const matrix&lt;T&gt; &amp;)&quot;:
template-Argument für &quot;T&quot; konnte nicht hergeleitet werden. matrix.h	87
</code></pre>
<p>Nachdem die Fehler bei gcc aufgetreten waren, hatte ich mittels googlen herausgefunden, dass man anstelle</p>
<pre><code class="language-cpp">friend matrix&lt;T&gt; operator - (const T c, const matrix&lt;T&gt;&amp; m );
</code></pre>
<p>nun bei gcc/c++ und anderen c++ Compilern neuerdings (seit 2003?)</p>
<pre><code class="language-cpp">friend matrix&lt;T&gt; (::operator - &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );
</code></pre>
<p>schreiben muss. Offensichtlich kann MSVSC++ nur was mit der alten Schreibweise anfangen.<br />
Weiss jemand dazu Näheres, und besonders: wie kann ich das Problem bei MS umgehen? (Ich möchte hier möglichst keine #ifdefs schreiben)</p>
<p>Viele Grüsse von tesu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293912</guid><dc:creator><![CDATA[tesuji]]></dc:creator><pubDate>Mon, 28 May 2007 16:43:54 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Mon, 28 May 2007 17:05:29 GMT]]></title><description><![CDATA[<p>tesuji schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// add scalar to components
   matrix&lt;T&gt; operator + (const T c);
   friend matrix&lt;T&gt; operator + (const T c, const matrix&lt;T&gt;&amp; m );
   //// friend matrix&lt;T&gt; (::operator + &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

   // sub scalar from components
   matrix&lt;T&gt; operator - (const T c);					          
   // sub components from const scalar
   friend matrix&lt;T&gt;  operator - (const T c, const matrix&lt;T&gt;&amp; m );
   //// friend matrix&lt;T&gt; (::operator - &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

   // mult all matrix components by scalar c
   matrix&lt;T&gt; operator * (const T c);
   friend matrix&lt;T&gt; operator * (const T c, const matrix&lt;T&gt;&amp; m );
   //// friend matrix&lt;T&gt; (::operator * &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

Meldungen bei gcc/c++ (wxDev-C++ 6.10-2):  

 Warnungen:  
   65 D:\Programming\000-devcpp\matrix.h [Warning] friend declaration `matrix&lt;T&gt; 
   operator+(T, const matrix&lt;T&gt;&amp;)' declares a non-template function 
   65 D:\Programming\000-devcpp\matrix.h [Warning] (if this is not what you intended, 
   make sure the function template has already been declared and add &lt;&gt; after the 
   function name here) -Wno-non-template-friend disables this warning 

Fehler:   
   [Linker Error] undefined reference to `operator*(double, matrix&lt;double&gt; const&amp;)' 
   [Linker Error] undefined reference to `operator*(double, matrix&lt;double&gt; const&amp;)' 
   [Linker Error] undefined reference to `operator-(double, matrix&lt;double&gt; const&amp;)' 
   [Linker Error] undefined reference to `operator*(double, matrix&lt;double&gt; const&amp;)' 
   [Linker Error] undefined reference to `operator+(double, matrix&lt;double&gt; const&amp;)'
</code></pre>
</blockquote>
<p>Die Linkerfehler kommen daher das du die friend funktion nicht bei der Deklaration definiert hast. ( siehe Link dbzgl. nochmal )</p>
<p>So:</p>
<pre><code class="language-cpp">// add scalar to components
   matrix&lt;T&gt; operator + (const T c);
   friend matrix&lt;T&gt; operator + (const T c, const matrix&lt;T&gt;&amp; m )
   {
     // implementation
   }
   //// friend matrix&lt;T&gt; (::operator + &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

   // sub scalar from components
   matrix&lt;T&gt; operator - (const T c);					          
   // sub components from const scalar
   friend matrix&lt;T&gt;  operator - (const T c, const matrix&lt;T&gt;&amp; m );
   {
     // implementation
   }
   //// friend matrix&lt;T&gt; (::operator - &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );

   // mult all matrix components by scalar c
   matrix&lt;T&gt; operator * (const T c);
   friend matrix&lt;T&gt; operator * (const T c, const matrix&lt;T&gt;&amp; m )
   {
     // implementation
   }
   //// friend matrix&lt;T&gt; (::operator * &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );
</code></pre>
<p>Dann sollte das in beiden Compilern funktionieren.</p>
<p>Davon weiß ich noch gar nichts:</p>
<blockquote>
<p>nun bei gcc/c++ und anderen c++ Compilern neuerdings (seit 2003?)</p>
<pre><code class="language-cpp">friend matrix&lt;T&gt; (::operator - &lt;&gt;)(const T c, const matrix&lt;T&gt;&amp; m );
</code></pre>
</blockquote>
<p>Werde mich mal irgendwann darüber erkunden.;)</p>
<p>Du könntest ja dir auch die ganze friend-Geschichte sparen und normale Funktion definieren, die über get-Funktion Zugriff auf die gebrauchten Daten haben, falls das in deinem Design schön aussieht.</p>
<p>P.S.: Zudem gibts da noch ein paar Schönheitsfehler, die klären wir aber nachdem du das momentane Problem gelöst hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293935</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 28 May 2007 17:05:29 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Mon, 28 May 2007 17:05:08 GMT]]></title><description><![CDATA[<p>Zur Schreibweise: GCC kommt gut auch so zurecht:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
Matrix&lt;T&gt; operator*(const T&amp; zahl, const Matrix&lt;T&gt;&amp; m) {
    Matrix&lt;T&gt; temp = m;
    return temp *= zahl;  // Aufruf von Member-operator*=(zahl)
}
</code></pre>
<p>Man kann dabei vollständig auf friend-Deklarationen verzichten, weil der Member-Operator operator*=() benutzt wird (den muss es natürlich geben).<br />
MSVC habe ich nicht, müsste es dem Posting nach aber auch können.<br />
Weiterer Vorteil: Nutzung desselben Codes in operator*(const T&amp; zahl, const Matrix&lt;T&gt;&amp; m) (global) und operator*=(const T&amp; zahl) (member).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293936</guid><dc:creator><![CDATA[UBr]]></dc:creator><pubDate>Mon, 28 May 2007 17:05:08 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Mon, 28 May 2007 17:08:13 GMT]]></title><description><![CDATA[<p>Hallo KasF,</p>
<p>ich hatte übersehen, dass du</p>
<pre><code class="language-cpp">friend matrix&lt;T&gt;::operator + (const T c, const matrix&lt;T&gt;&amp; m );
</code></pre>
<p>geschrieben hattest (mit zwei Doppelpunkten).</p>
<p>Wenn ich diese Schreibweise verwende, bekomme ich folgende Fehlermeldung bei MSVSC++:</p>
<p>Fehler 1 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt. matrix.h 70</p>
<p>und bei gcc/c++ v:</p>
<p>65 D:\Programming\000-devcpp\matrix.h ISO C++ forbids declaration of <code>operator+' with no type 65 D:\\Programming\\000-devcpp\\matrix.h</code>static int matrix&lt;T&gt;::operator+(T, const matrix&lt;T&gt;&amp;)' must be either a non-static member function or a non-member function<br />
65 D:\Programming\000-devcpp\matrix.h [Warning] member functions are implicitly friends of their class</p>
<p>vg. tesu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293940</guid><dc:creator><![CDATA[tesuji]]></dc:creator><pubDate>Mon, 28 May 2007 17:08:13 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Mon, 28 May 2007 17:15:24 GMT]]></title><description><![CDATA[<p>tesuji schrieb:</p>
<blockquote>
<p>H</p>
<pre><code class="language-cpp">friend matrix&lt;T&gt;::operator + (const T c, const matrix&lt;T&gt;&amp; m );
</code></pre>
</blockquote>
<p>Sorry, da hatte ich mich irgendwie vertippt/verdenkt :D. Sollte natürlich so aussehen:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; class matrix : public mave&lt;T&gt;
{
 public:
// ...
friend matrix&lt;T&gt; operator+(const T c, const matrix&lt;T&gt;&amp; m )
{
  //imp.
}
// ...
}
</code></pre>
<p>Und nochmal &quot;Hallo&quot; und *verbeug* vor Herr UBr <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>
<p>Edit: Mach das so wie UBr es gesagt hat, nicht so wie ich meinte mit get-Funktionen. So ist es natürlich Designtechnisch am schönsten ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293950</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 28 May 2007 17:15:24 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Mon, 28 May 2007 17:19:26 GMT]]></title><description><![CDATA[<p>Vielen Dank, KasF und uBr für eure ausführliche Antworten. Ich hatt die friends nur eingeführt, weil ich bei den zweiten Definitionen immer die Fehlermeldung bekam, dass nur genau ein Parameter in der Parameterliste zulässig sei. Da hab ich mir wohl mit friend tiefergehende Probleme eingehandelt.</p>
<p>Ich werde euere Vorschläge nun genau studieren und in meine Klasse einbauen. Dann melde ich mich wieder. (qKasF, ich freue mich, wenn du mich auf Schönheitsfehler hinweist. (Das ist meine erste größere Klassendefinition, und ich bin ja bereits über einige Fallstricke gestolpert. Die Sache mit (::operator - &lt;&gt;) und der forward-Deklaration hatte ich erst nach langem Suchen auf englischen Seiten gefunden, aber eure Deklaration ist schöner)</p>
<p>Viele Grüsse von tesu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293952</guid><dc:creator><![CDATA[tesuji]]></dc:creator><pubDate>Mon, 28 May 2007 17:19:26 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Mon, 28 May 2007 19:13:18 GMT]]></title><description><![CDATA[<p>Hallo UBr,<br />
ich habe deinen Vorschlag umgesetzt und es funktioniert bei MSVC++ und gcc korrekt! Mein allergrößter Dank geht an dich (Ich fummelte an dieser Sache schon fast ein Woche rum).</p>
<p>edit: KasF, du hattest die Lösung ja bereits ganz am Anfang gesagt, Zitat: &quot;Die Linkerfehler kommen daher das du die friend funktion nicht bei der Deklaration definiert hast.&quot; Sorry, ich hätte da mal genauer Lesen sollen. Deshalb mein allergrößter Dank auch an dich.</p>
<p>Hier ist der Code:</p>
<pre><code class="language-cpp">// add scalar to components
   matrix&lt;T&gt; operator + (const T c);

   // add components to scalar (Alternative von UBr)
   friend inline matrix&lt;T&gt; operator + (const T c, const matrix&lt;T&gt;&amp; m )
   { matrix&lt;T&gt; s(m); for (int i = 0; i &lt; s.roco; i++) s.mat[i] += c; return s;}

   // sub scalar from components
   matrix&lt;T&gt; operator - (const T c);

   // sub components from const scalar (Alternative von UBr)
   friend matrix&lt;T&gt; operator - (const T c, const matrix&lt;T&gt;&amp; m )
   { matrix&lt;T&gt; s(m);  for (int i = 0; i &lt; s.roco; i++) s.mat[i] = c - s.mat[i];
     return s;}

   // mult all matrix components of m by scalar c
   matrix&lt;T&gt; operator * (const T c);

   // mult scalar c by all matrix components of m (Alternative von Ubr)
   friend inline matrix&lt;T&gt; operator * (const T c, const matrix&lt;T&gt;&amp; m )
   { matrix&lt;T&gt; s(m); for (int i = 0; i &lt; s.roco; i++) s.mat[i] *= c; return s;}
</code></pre>
<p>Der Grund, warum ich die Operationen immer paarweise brauche ist, dass sowohl s+M als auch M+s berechenbar sein muss, wenn s ein Skalar und M eine Matrix ist. Die forward-Deklarationen sind bei deiner Lösung auch nicht mehr erforderlich.</p>
<p>Auf die friends konnte ich jedoch (noch) nicht verzichten, da ohne sie sowohl bei gcc als auch MSc++ eine Lawine von Fehlern auftrat.</p>
<p>Falls du weitere Schwachstellen im Code findest, bitte teile sie mir mit.</p>
<p>Viele Grüsse von tesu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294003</guid><dc:creator><![CDATA[tesuji]]></dc:creator><pubDate>Mon, 28 May 2007 19:13:18 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Mon, 28 May 2007 19:46:05 GMT]]></title><description><![CDATA[<p>Naja, das ist zwar was ich dir von Anfang an vorgeschlagen habe, aber wurscht <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="🙂"
    /><br />
Das was UBr geschrieben hat, hast du ja auch noch nicht ganz umgesetzt.</p>
<p>1.) Implentiere deine operator +,-,/ etc. mit +=,-=,/= etc. So wie es UBr vorgeschlagen hat. Somit hast du keinen doppelten Code was auch direkt Konsistenter ist.<br />
Nun brauchst du auch wie du im Beispiel siehst keine friends mehr. Mach das in deinem Code genauso.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">class MyClass {

    private:
            int zahl;
    public:
            MyClass() {}

            MyClass&amp; operator+=(int z)
            {
                zahl += z;
                return *this;
            }

            const MyClass operator+(int z)
            {
                return MyClass(*this) += z;
            }

};

const MyClass operator+(int z, const MyClass&amp; obj)
{
    return MyClass(obj) += z;
}
</code></pre>
<p>2.) Mache aus deinen &quot;const T c&quot;'s überall ein &quot;const T&amp; c&quot;. Man weiß ja nie was T sein könnte ...</p>
<p>Das wars erstmal <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="😉"
    /></p>
<p>Edit: Hab dein Edit nicht gesehen das ich zwischenzeitlich weg war ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294024</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 28 May 2007 19:46:05 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Mon, 28 May 2007 23:29:05 GMT]]></title><description><![CDATA[<p>Danke KasF.</p>
<p>dass ich aus const T c ein const T&amp; c machen soll, liegt das daran, dass dann anstelle einer vollständigen Kopie eine Referenz auf c übergeben wird? Das wird dann Speicherplatz auf dem Stack einsparen und auch schneller laufen.</p>
<p>vg. tesu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294126</guid><dc:creator><![CDATA[tesuji]]></dc:creator><pubDate>Mon, 28 May 2007 23:29:05 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Tue, 29 May 2007 06:03:05 GMT]]></title><description><![CDATA[<p>Nur so nebenbei: in der Declaration der Klasse selbst lässt man das &quot;&lt;T&gt;&quot; üblicherweise weg, also so:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; class matrix : public mave&lt;T&gt; 
{ 
 public: 
   //matrix&lt;T&gt; (unsigned row) : mave&lt;T&gt;(row){rangk=-1;} 
   matrix (unsigned row) : mave&lt;T&gt;(row){rangk=-1;} 

   // ...

   // ~ operator 
   //matrix&lt;T&gt; operator ~(){return matrix&lt;T&gt;(mave&lt;T&gt;::operator ~(/*-:)*/));} 
   matrix operator ~(){return matrix(mave&lt;T&gt;::operator ~(/*-:)*/));} 

   // assignment operators 
   //matrix&lt;T&gt;&amp; operator  = (const T s); 
   matrix&amp; operator  = (const T s);
</code></pre>
<p>Ich weiss nichtmal ob das laut Standard überhaupt erlaubt ist das &quot;&lt;T&gt;&quot; beim ctor/dtor zu schreiben so wie du das machst. Bei Parametern-Typen/Return-Typ ist es ziemlich sicher erlaubt, nur eben auch unnötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294167</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 29 May 2007 06:03:05 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Tue, 29 May 2007 12:21:44 GMT]]></title><description><![CDATA[<p>tesuji schrieb:</p>
<blockquote>
<p>dass ich aus const T c ein const T&amp; c machen soll, liegt das daran, dass dann anstelle einer vollständigen Kopie eine Referenz auf c übergeben wird? Das wird dann Speicherplatz auf dem Stack einsparen und auch schneller laufen.</p>
</blockquote>
<p>Ja so ist es, du ersparst somit schon viel ...</p>
<p>Zudem würde ich das noch machen was hustbaer geschrieben hat und noch alle Rückgabewerte von op+,-,* und / zu const matrix&lt;T&gt; machen.</p>
<p>Damit auch nicht ja jemand sowas machen kann:</p>
<pre><code class="language-cpp">matrix&lt;int&gt; a,b,c;
//...
a + b = c;
</code></pre>
<p>Dazu gibts aber noch was schönes von camper hier: <a href="http://c-plusplus.net/forum/viewtopic-var-p-is-1275887.html#1275887" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-p-is-1275887.html#1275887</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294420</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 29 May 2007 12:21:44 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Tue, 29 May 2007 14:42:32 GMT]]></title><description><![CDATA[<p>hi liebes Forum,</p>
<p>Ich habe euere Vorschläge nun in die Matrizenklasse übernommen:</p>
<p>1. Alle binären Operatoren (+,-,<em>,/) durch die zuvor definierten arithmetischen<br />
Zuweisungsoperatoren (+=,-=,</em>=,/=) ersetzen. Das funktioniert nun bestens,<br />
und der Code ist wie KasF und UBr sagten viel übersichtlicher und<br />
konsistenter.</p>
<p>2. const T s habe ich überall (wo es zulässig war) durch const T&amp; s ersetzt. Mir<br />
ist nun klar, was das bedeutet.</p>
<p>3. Den Vorschlag von hustbaer matrix&lt;T&gt; durch matrix zu ersetzen, wie in:<br />
matrix&lt;T&gt;&amp; operator = (const T s); also: matrix&amp; operator = (const T s);<br />
habe ich auch übernommen. Ich hatte die Schreibweise matrix&lt;T&gt; irgend wo<br />
gesehen und ohne Überlegung nachgeschrieben. Mir ist jetzt klar, dass es bei<br />
der Deklaration genügt nur matrix zu schreiben, weil das bereits eindeutig<br />
ist. Danke hustbaer!</p>
<p>Hier der verbesserte Code:</p>
<pre><code class="language-cpp">// numeric assignment operators
   matrix operator += (T s);
   matrix operator -= (T s);
   matrix operator *= (T s);
   matrix operator /= (T s);
   matrix operator += (const matrix&lt;T&gt;&amp; m);
   matrix operator -= (const matrix&lt;T&gt;&amp; m);
   matrix operator *= (const matrix&lt;T&gt;&amp; m);

   // unary operators
   matrix operator + ();   // does nothing, yet satisfies true completeness
   matrix operator - ();   // changes signs of all components
   matrix operator ! ();   // inverse of matrix

   // binary operators
   // add scalar s to all components of matrix this: *this + s
   inline matrix operator + (const T&amp; s)
    {matrix&lt;T&gt; a(*this); return (a += s);}

   // add scalar s to all components of matrix m:  c + a
   friend inline matrix operator + (const T&amp; s, const matrix&lt;T&gt;&amp; m )
    {matrix&lt;T&gt; a(m); return (a += s);}

   // sub scalar s from all components of matrix this: *this - s
   inline matrix operator - (const T&amp; s)
    {matrix&lt;T&gt; a(*this); return (a -= s);}

   // sub all components of matrix m from scalar s:
   friend inline matrix operator - (const T&amp; s, const matrix&lt;T&gt;&amp; m )
    {matrix&lt;T&gt; a(m); return (a = -a + s);}

   // mult all matrix components by scalar c
   inline matrix operator * (const T&amp; s)
    {matrix&lt;T&gt; a(*this); return (a *= s);}

   friend inline matrix operator * (const T&amp; s, const matrix&lt;T&gt;&amp; m )
    {matrix&lt;T&gt; a(m); return (a *= s);}

   // div all matrix components by scalar s
   matrix operator / (const T&amp; s)
    {matrix&lt;T&gt; a(*this); return (a /= s);}

   // matrix to power p, a^p   (a*a ... *a, p-times)
   matrix operator ^ (int p)
     { matrix&lt;T&gt; m(*this); for (int i = 1; i &lt; p; i++ ) m *= *this; return m;}
</code></pre>
<p>Übrigens, ich habe auch &quot;matrix to power p&quot; so wie ihr das vorgeschlagen hat<br />
abgeändert in m *= *this !!! Die ganzen Matrizenmultiplikationen, die ich da programmiert hatte, sind nun einfach weg! Das ganze wird so langsam unheimlich kurz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Leider kann ich aber auf die friends (und damit auch auf die forward-Deklarationen zu Beginn der Klasse)<br />
immer noch nicht verzichten, denn wenn ich z.B. aus:</p>
<pre><code class="language-cpp">// add scalar s to all components of matrix this: *this + s
   inline matrix operator + (const T&amp; s)
    {matrix&lt;T&gt; a(*this); return (a += s);}

   // add scalar s to all components of matrix m:  c + a
   friend inline matrix operator + (const T&amp; s, const matrix&lt;T&gt;&amp; m )
    {matrix&lt;T&gt; a(m); return (a += s);}

das mache:

   // add scalar s to all components of matrix this: *this + s
   inline matrix operator + (const T&amp; s)
    {matrix&lt;T&gt; a(*this); return (a += s);}

   // add scalar s to all components of matrix m:  c + a
   inline matrix operator + (const T&amp; s, const matrix&lt;T&gt;&amp; m )
    {matrix&lt;T&gt; a(m); return (a += s);}
</code></pre>
<p>bekommen ich immer noch diese Fehlermeldungen:</p>
<p>gcc:<br />
71 D:\Programming\000-devcpp\matrix.h `matrix&lt;T&gt; matrix&lt;T&gt;::operator+(const T&amp;, const matrix&lt;T&gt;&amp;)<br />
[with T = int]' must take either zero or one argument</p>
<p>MSVC++<br />
Fehler 1 error C2804: Binärer Operator '+' hat zu viele Parameter<br />
E:\matrix.h 71</p>
<p>Ich dachte, da nun der Implementierungsteil der beiden Operatoren im Deklarationssteil steht, müssten die beiden überladenen Operatoren doch eindeutig unterscheidbar sein. Was kann da falsch sein?</p>
<p>@KasF, du schreibst: ... und noch alle Rückgabewerte von op+,-,* und / zu const matrix&lt;T&gt; machen.</p>
<p>Ist das z.B. so zu verstehen, dass ich für matrix&lt;T&gt; a(*this):</p>
<pre><code class="language-cpp">// add scalar s to all components of matrix this: *this + s
   inline matrix operator + (const T&amp; s)
    {const matrix&lt;T&gt; a(*this); return (a += s);}
</code></pre>
<p>schreiben soll? Dann kann aber a += s nicht mehr ausgeführt werden (ich habs<br />
also falsch verstanden)</p>
<p>Viele Grüsse von tesu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294534</guid><dc:creator><![CDATA[tesuji]]></dc:creator><pubDate>Tue, 29 May 2007 14:42:32 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Tue, 29 May 2007 16:41:15 GMT]]></title><description><![CDATA[<p>Die globalen (binären Operatoren sollten <em>nicht innerhalb</em> der Klasse deklariert werden, dann brauchen sie auch nicht friend zu sein. Beispiel:</p>
<pre><code class="language-cpp">// matrix.h
// hier ist die Klasse matrix. ...
}; // Ende der Klasse
// DANACH erst folgen die  binären Operatoren:
template&lt;class T&gt;
matrix&lt;T&gt; operator*(const T&amp; zahl, const matrix&lt;T&gt; &amp;m) {
    matrix&lt;T&gt; temp = m;
    return temp *= zahl; 
}
// ... usw
</code></pre>
<p>friend ist nicht notwendig, weil keinerlei Zugriff auf interne Daten erfolgt, nur auf den Member-Operator, und der ist public.<br />
Innerhalb der Klasse stehen die Kurzform-Operatoren *= usw. Diese sollten aber nicht matrix zurückgeben, sondern matrix&amp;, weil sonst eine unnötige Kopie erzeugt wird. Die letzte Anweisung in z.B. operator+=(...) ist return *this. Dann sind auch verkettete Rechnungen möglich wie a += b += c; Hoffentlich habe ich die angefragte Problemstellung richtig interpretiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294658</guid><dc:creator><![CDATA[UBr]]></dc:creator><pubDate>Tue, 29 May 2007 16:41:15 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Tue, 29 May 2007 16:44:49 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>tesuji schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// numeric assignment operators
   matrix operator += (T s);
   matrix operator -= (T s);
   matrix operator *= (T s);
   matrix operator /= (T s);
   matrix operator += (const matrix&lt;T&gt;&amp; m);
   matrix operator -= (const matrix&lt;T&gt;&amp; m);
   matrix operator *= (const matrix&lt;T&gt;&amp; m);
</code></pre>
</blockquote>
<p>Die ganzen Zuweisungsoperatoren ( nannte man die so ? ) müssen bzw sollten alle eine Refernz auf *this zurückgeben.</p>
<p>Sowie wie in dem Code auf Seite 1 von mir:</p>
<pre><code class="language-cpp">MyClass&amp; operator+=(int z)
{
     zahl += z;
     return *this;
}
</code></pre>
<p>Weil dies erstens perfomanter ist und zudem in einem weiter Ausdruck benutzt werden kann.</p>
<p>tesuji schrieb:</p>
<blockquote>
<p>// add scalar s to all components of matrix m: c + a<br />
inline matrix operator + (const T&amp; s, const matrix&lt;T&gt;&amp; m )<br />
{matrix&lt;T&gt; a(m); return (a += s);}<br />
[/cpp]<br />
bekommen ich immer noch diese Fehlermeldungen:</p>
<p>gcc:<br />
71 D:\Programming\000-devcpp\matrix.h `matrix&lt;T&gt; matrix&lt;T&gt;::operator+(const T&amp;, const matrix&lt;T&gt;&amp;)<br />
[with T = int]' must take either zero or one argument</p>
<p>MSVC++<br />
Fehler 1 error C2804: Binärer Operator '+' hat zu viele Parameter<br />
E:\matrix.h 71</p>
</blockquote>
<p>Du musst den operator+(const T&amp;, const matrix&lt;T&gt;&amp;) global definieren, sowie in MyClass ( Seite 1 ).<br />
Durch das friend sind das ja keine Memberfunktionen. Damit sowas wie m1 = 3 + m2 funktioniert muss es ja eine globale Funktion geben die ein int und ein matrix&lt;T&gt; erwartet.<br />
Deswegen die op's global machen.</p>
<p>Ein operator+(const T&amp;, const matrix&lt;T&gt;&amp;) als Member kann nicht funktionieren, einfaches Beispiel dazu:</p>
<pre><code class="language-cpp">// op+(const T&amp;, const matrix&lt;T&gt;&amp;) ist global
m1 = 3 + m2;
// Compiler sucht für op+ was ein int und matrix als parameter hat -&gt; gefunden

// op+(const T&amp;, const matrix&lt;T&gt;&amp;) ist in Klasse
m1 = m2 + m3;
// Compiler sieht das als m1.operator=( m2.operator+(matrix) )
// &quot; m2.operator+(matrix)&quot; m2 ist matrix, matrix hat ein op+(matrix)

// op+(const T&amp;, const matrix&lt;T&gt;&amp;) ist in Klasse
m1 = 3 + m2;
// Compiler sucht für op+ was ein int und matrix als parameter hat, kann einen aber nicht finden, den es einen \3.operator+(matrix\ ja auch nicht gibt.
</code></pre>
<p>tesuji schrieb:</p>
<blockquote>
<p>@KasF, du schreibst: ... und noch alle Rückgabewerte von op+,-,* und / zu const matrix&lt;T&gt; machen.</p>
<p>Ist das z.B. so zu verstehen, dass ich für matrix&lt;T&gt; a(*this):</p>
<pre><code class="language-cpp">// add scalar s to all components of matrix this: *this + s
   inline matrix operator + (const T&amp; s)
    {const matrix&lt;T&gt; a(*this); return (a += s);}
</code></pre>
<p>schreiben soll?</p>
</blockquote>
<p>Ne, so:</p>
<pre><code class="language-cpp">// add scalar s to all components of matrix this: *this + s
   inline const matrix operator + (const T&amp; s)
    { matrix&lt;T&gt; a(*this); return (a += s);}
</code></pre>
<p>Edit: to slow ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294659</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 29 May 2007 16:44:49 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Wed, 30 May 2007 20:03:25 GMT]]></title><description><![CDATA[<p>Hallo hustbaer, Br und KasF,<br />
ich hab nun fast alle eure Vorschläge übernommen und es funktioniert bereits sehr gut. Ich hänge allerdings immer noch mit den &quot;friends&quot; rum (ich hatte auch gedacht, dass das ja eigentlich keine Memberfunktionen sein müssen, aber es gibt immer noch Fehler, wenn ich die betreffenden Operatoren aus der Klassendeklaration rausnehme und in den Implementierungsteil stecke). Ich werde mich deshalb noch einmal melden, sobald ich ein paar Tests mit einer Primtivklasse, in der ich das Problem isolieren werde, gemacht habe, falls ich nicht weiterkommen sollte.</p>
<p>Ich möchte an euer Forum ein ganz grosses Dankeschön sagen. Denn so schnell, ausführlich und geduldig wie ihr hier Fragen super professionell beantwortet, habe ich sonst noch nirgendwo erlebt. Ich habe unheimlich viel von euch gelernt. Danke! (In TechInfo wird bei uns die ganze c++ oop nur sehr dürftig vermittelt, ich glaube nun auch, dass unsere beiden Profs, da auch nicht so richtig den Überblick haben, denn wir haben mit C++ fast nur einfaches C gemacht).</p>
<p>Hier will ich euch die ersten Rechenergebnisse mit den Matrizenoperatoren zeigen. Ich habe auch cout &lt;&lt; überladen, und kann nun Matrizen ausgeben. Und die Indexe c(500, 333) funktionieren auch. Die Matrix c ist eine 2x4 Matrix, aber ihre Indexe sind so zu gebrauchen: c(501,335) = 10. Es werden aber nur 2x4 = 8 double allokiert. Hier die Ergebnisse:</p>
<pre><code>matrix&lt;double&gt; c(500, 501, 333, 336)

c  = -1:
-1      -1      -1      -1
-1      -1      -1      -1

Properties of matrix c:
Rectangular matrix: 2 rows * 4 columns
row subscripts from 500 to 501
col subscripts from 333 to 336

Components:
-1      -1      -1      -1
-1      -1      -1      -1

c += 6:
5       5       5       5
5       5       5       5

c -= 1:
4       4       4       4
4       4       4       4

c *= 2:
8       8       8       8
8       8       8       8

c /= 4:
2       2       2       2
2       2       2       2

c = c+1:
3       3       3       3
3       3       3       3

c = 3+c:
6       6       6       6
6       6       6       6

c = c-2:
4       4       4       4
4       4       4       4

c = 10-c:
6       6       6       6
6       6       6       6

c = c*2:
12      12      12      12
12      12      12      12

c = c/3:
4       4       4       4
4       4       4       4

c = 2*c:
8       8       8       8
8       8       8       8

Transpose c = ~c
8       8
8       8
8       8
8       8

c *= ~c:
256     256
256     256

c = 1 + 2*(c^2) - 6*(c^3) + 9*(c^4):
3.08835e+011    3.08835e+011
3.08835e+011    3.08835e+011

Matrix c to be inverted (c(1,0) = c(0,1) = 1):
3.08835e+011    1
1       3.08835e+011

Inverse c = !c:
3.23797e-012    -1.04845e-023
-1.04845e-023   3.23797e-012

Identity I = !c * c:
1       1.2326e-028
0       1
</code></pre>
<p>Viele Grüsse von tesu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295541</guid><dc:creator><![CDATA[tesuji]]></dc:creator><pubDate>Wed, 30 May 2007 20:03:25 GMT</pubDate></item><item><title><![CDATA[Reply to Operator + : template-Argument für &amp;quot;T&amp;quot; konnte nicht hergeleitet werden? on Wed, 30 May 2007 20:18:46 GMT]]></title><description><![CDATA[<p>tesuji schrieb:</p>
<blockquote>
<p>Ich möchte an euer Forum ein ganz grosses Dankeschön sagen. Denn so schnell, ausführlich und geduldig wie ihr hier Fragen super professionell beantwortet, habe ich sonst noch nirgendwo erlebt. Ich habe unheimlich viel von euch gelernt. Danke! (In TechInfo wird bei uns die ganze c++ oop nur sehr dürftig vermittelt, ich glaube nun auch, dass unsere beiden Profs, da auch nicht so richtig den Überblick haben, denn wir haben mit C++ fast nur einfaches C gemacht).</p>
</blockquote>
<p>Keine Ursache <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="😉"
    /> Solange hier jemand sein Probleme schön schildert und von uns nicht erwartet das wir irgendwas für ihn machen und er selbst lernwillig ist, helfen wir den Leuten hier gerne.</p>
<p>Zudem lerne ich selber nur dadurch, in dem ich mich mit Problemen anderer beschäftige. Dann wird mal ab und zu da und hier nochmal nachgeschaut/-geblättert und so behalte ich auch einiges besser im Kopf, wenn ich etwas schreibe <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1295555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1295555</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 30 May 2007 20:18:46 GMT</pubDate></item></channel></rss>