<?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 Parameter von tr1::result_of&amp;lt;&amp;gt;]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe eine Anwendung von tr1::result_of&lt;&gt; codiert, komme aber beim Template Parameter zu keiner compilierfähigen Lösung. Mein auf das notwendigste reduzierter Code ist der folgende:</p>
<pre><code class="language-cpp">#include &lt;boost/tr1/functional.hpp&gt; // result_of

struct A {};
struct B {};
struct C {};
C func( A, B )
{
    return C();
}

template&lt; typename T1, typename T2 &gt;
typename std::tr1::result_of&lt; func( T1, T2 ) &gt;::type // &lt;-- hier ist was falsch
    call_f( T1 x1, T2 x2 )
{
    return func( x1, x2 );
}

int main()
{
    A a;
    B b;
    C c = func( a, b );
    C malSehn = call_f( a, b );
    return 0;
}
</code></pre>
<p>Bei der Deklaration des Returnwerts von call_f meckert der Compiler &quot;error C2275: 'T1' : illegal use of this type as an expression&quot;. Ich nutze VC8 (alias Visual Studio 2005) mit dem aktuellen Service Pack.<br />
Beim ursprünglichen Problem war func == operator*; aber wenn ich wüsste, wie das obige funktioniert, wäre mir schon geholfen.<br />
Hat einer 'ne Idee wie man den Funktionstyp richtig angibt?</p>
<p>:xmas2: Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200850/template-parameter-von-tr1-result_of-lt-gt</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 04:09:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200850.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 20 Dec 2007 13:10:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Parameter von tr1::result_of&amp;lt;&amp;gt; on Thu, 20 Dec 2007 13:10:30 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe eine Anwendung von tr1::result_of&lt;&gt; codiert, komme aber beim Template Parameter zu keiner compilierfähigen Lösung. Mein auf das notwendigste reduzierter Code ist der folgende:</p>
<pre><code class="language-cpp">#include &lt;boost/tr1/functional.hpp&gt; // result_of

struct A {};
struct B {};
struct C {};
C func( A, B )
{
    return C();
}

template&lt; typename T1, typename T2 &gt;
typename std::tr1::result_of&lt; func( T1, T2 ) &gt;::type // &lt;-- hier ist was falsch
    call_f( T1 x1, T2 x2 )
{
    return func( x1, x2 );
}

int main()
{
    A a;
    B b;
    C c = func( a, b );
    C malSehn = call_f( a, b );
    return 0;
}
</code></pre>
<p>Bei der Deklaration des Returnwerts von call_f meckert der Compiler &quot;error C2275: 'T1' : illegal use of this type as an expression&quot;. Ich nutze VC8 (alias Visual Studio 2005) mit dem aktuellen Service Pack.<br />
Beim ursprünglichen Problem war func == operator*; aber wenn ich wüsste, wie das obige funktioniert, wäre mir schon geholfen.<br />
Hat einer 'ne Idee wie man den Funktionstyp richtig angibt?</p>
<p>:xmas2: Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423783</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 20 Dec 2007 13:10:30 GMT</pubDate></item><item><title><![CDATA[Reply to Template Parameter von tr1::result_of&amp;lt;&amp;gt; on Thu, 20 Dec 2007 13:23:34 GMT]]></title><description><![CDATA[<p>Hmm liegt es vllt daran, dass du einen Typ an deine func übergibst und keine Variable?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423800</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Thu, 20 Dec 2007 13:23:34 GMT</pubDate></item><item><title><![CDATA[Reply to Template Parameter von tr1::result_of&amp;lt;&amp;gt; on Thu, 20 Dec 2007 13:38:42 GMT]]></title><description><![CDATA[<p>Natürlich ein Typ; was den sonst ?? Das ist schließlich ein Template Parameter</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423814</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 20 Dec 2007 13:38:42 GMT</pubDate></item><item><title><![CDATA[Reply to Template Parameter von tr1::result_of&amp;lt;&amp;gt; on Thu, 20 Dec 2007 13:49:35 GMT]]></title><description><![CDATA[<p>Höö? Bin ich gerade blind, oder stimmt das nicht was du gesagt hast:</p>
<pre><code class="language-cpp">C func( A, B )
{
    return C();
}
</code></pre>
<p>==</p>
<pre><code class="language-cpp">C func(A param1, B param2)
{
    return C();
}
</code></pre>
<p>... demnach kann func wenig mit einem &quot;type as an expression&quot; anfangen ... !?</p>
<pre><code class="language-cpp">template &lt;typename T1, typename T2&gt;
func( T1, T2 )
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423826</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Thu, 20 Dec 2007 13:49:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template Parameter von tr1::result_of&amp;lt;&amp;gt; on Thu, 20 Dec 2007 14:06:50 GMT]]></title><description><![CDATA[<p>(D)Evil schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template &lt;typename T1, typename T2&gt;
func( T1, T2 )
</code></pre>
<p>?</p>
</blockquote>
<p>.. nein Du bist nicht blind <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 />
Mein Gedanke ist, dass der Ausdruck func( T1, T2 ) der Typ einer Funktion mit dem Namen 'func' sein soll - der Name steht fest - und den zwei Typen T1 und T2. Der Compiler sieht das anders; d.h diese Syntax ist wohl falsch - das ist ja meine Frage.<br />
Ich kann den Funktionsnamen als drittes Argument des Templates call_f angeben, das möchte ich aber nicht, den der steht schon fest und ich will/kann den nicht als Parameter mit angeben, da - wie schon erwähnt - im Original-Problem es sich um den operator* handelt.</p>
<p>:xmas2: Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423848</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 20 Dec 2007 14:06:50 GMT</pubDate></item><item><title><![CDATA[Reply to Template Parameter von tr1::result_of&amp;lt;&amp;gt; on Thu, 20 Dec 2007 14:31:09 GMT]]></title><description><![CDATA[<p>Wenn ich das richtig aus der Doku lese, muss bei</p>
<pre><code>result_of&lt;F(T1, T2, ..., TN)&gt;::type
</code></pre>
<p><em>F</em> ein Funktionszeiger<strong>typ</strong> sein. Dein <em>func</em> ist dagegen ein Funktionszeiger.</p>
<p>Dementsprechend funktioniert bei mir folgendes:</p>
<pre><code class="language-cpp">#include &lt;boost/tr1/functional.hpp&gt; // result_of

struct A {};
struct B {};
struct C {};
C func( A, B )
{
    return C();
}
typedef C (*funcptr)( A, B );

template&lt; typename T1, typename T2 &gt;
typename std::tr1::result_of&lt; funcptr( T1, T2 ) &gt;::type // &lt;-- hier ist was korrigiert
    call_f( T1 x1, T2 x2 )
{
    return func( x1, x2 );
}

int main()
{
    A a;
    B b;
    C c = func( a, b );
    C malSehn = call_f( a, b );
    return 0;
}
</code></pre>
<p>:xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423864</guid><dc:creator><![CDATA[michba]]></dc:creator><pubDate>Thu, 20 Dec 2007 14:31:09 GMT</pubDate></item><item><title><![CDATA[Reply to Template Parameter von tr1::result_of&amp;lt;&amp;gt; on Thu, 20 Dec 2007 14:51:56 GMT]]></title><description><![CDATA[<p>Danke michba,</p>
<p>Leider löst das mein Problem nicht, da A und B nicht die einzigen Typen sind, für die das Template eingesetzt werden soll. Und sobald ich ein zweites Tripel von Typen habe</p>
<pre><code class="language-cpp">typedef C2 (*funcptr)( A2, B2 );
</code></pre>
<p>Liefert mir der Compiler &quot;'funcptr' : redefinition; different basic types&quot;, und zwar mit Recht.</p>
<p>Ich habe mein Problem vielleicht zu sehr vereinfacht. Etwas konkreter beschrieben möchte ich sowas:</p>
<pre><code class="language-cpp">#include &lt;complex&gt;

template&lt; typename T &gt;
struct A 
{
    explicit A( const T&amp; x = T() ) : m_x( x ) {}
    T m_x;
};

// --  diesen Block würde ich mir gern ersparen
template&lt; typename T1, typename T2 &gt; 
struct result_of_multiplication;

template&lt;&gt;
struct result_of_multiplication&lt; double, std::complex&lt; double &gt; &gt;
{
    typedef std::complex&lt; double &gt; type;
};
template&lt;&gt;
struct result_of_multiplication&lt; std::complex&lt; double &gt;, double &gt;
{
    typedef std::complex&lt; double &gt; type;
};
// --  Block Ende

template&lt; typename T1, typename T2 &gt;
A&lt; typename result_of_multiplication&lt; T1, T2 &gt;::type &gt;
    operator*( const A&lt; T1 &gt;&amp; x1, const T2&amp; x2 )
{
    return A&lt; typename result_of_multiplication&lt; T1, T2 &gt;::type &gt;( x1.m_x * x2 );
}

int main()
{
    using namespace std;
    A&lt; complex&lt; double &gt; &gt; a1;
    A&lt; double &gt; a2;
    A&lt; complex&lt; double &gt; &gt; erg;
    complex&lt; double &gt; cplx( 0, 1 );

    erg = a1 * 2.01;    // A&lt; complex &gt; * double -&gt; A&lt; complex &gt;
    erg = a2 * cplx;    // A&lt; double &gt; * complex -&gt; A&lt; complex &gt;
    return 0;
}
</code></pre>
<p>Also der Ergebnistyp E von A&lt;E&gt; = A&lt;T1&gt; * T2 soll immer der sein, der sich auch aus der Multiplikation E = T1 * T2 ergibt. Ich hatte angenommen, tr1::result_of kann mir den generieren, fragt sich nur wie.</p>
<p>:xmas2: Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423884</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 20 Dec 2007 14:51:56 GMT</pubDate></item></channel></rss>