<?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[error C2664: &#x27;std::make_pair&#x27;: Konvertierung des Parameters 1 von &#x27;physx::PxMaterial *&#x27; in &#x27;physx::PxMaterial *&amp;amp;&amp;amp;&#x27; nicht]]></title><description><![CDATA[<blockquote>
<p>error C2664: 'std::make_pair': Konvertierung des Parameters 1 von 'physx::PxMaterial *' in 'physx::PxMaterial *&amp;&amp;' nicht möglich<br />
1&gt; Ein lvalue kann nicht an einen rvalue-Verweis gebunden werden.</p>
</blockquote>
<pre><code class="language-cpp">std::unordered_map&lt;PxMaterial*, PxMaterialTableIndex&gt; materialIndicesMap;
materialIndicesMap.insert(std::make_pair&lt;PxMaterial*, PxMaterialTableIndex&gt;(mat-&gt;second, index));
</code></pre>
<p>VC++ 2012. Was ist falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308382/error-c2664-std-make_pair-konvertierung-des-parameters-1-von-physx-pxmaterial-in-physx-pxmaterial-amp-amp-nicht</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 02:03:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308382.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Sep 2012 11:41:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to error C2664: &#x27;std::make_pair&#x27;: Konvertierung des Parameters 1 von &#x27;physx::PxMaterial *&#x27; in &#x27;physx::PxMaterial *&amp;amp;&amp;amp;&#x27; nicht on Sun, 23 Sep 2012 11:41:19 GMT]]></title><description><![CDATA[<blockquote>
<p>error C2664: 'std::make_pair': Konvertierung des Parameters 1 von 'physx::PxMaterial *' in 'physx::PxMaterial *&amp;&amp;' nicht möglich<br />
1&gt; Ein lvalue kann nicht an einen rvalue-Verweis gebunden werden.</p>
</blockquote>
<pre><code class="language-cpp">std::unordered_map&lt;PxMaterial*, PxMaterialTableIndex&gt; materialIndicesMap;
materialIndicesMap.insert(std::make_pair&lt;PxMaterial*, PxMaterialTableIndex&gt;(mat-&gt;second, index));
</code></pre>
<p>VC++ 2012. Was ist falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253708</guid><dc:creator><![CDATA[hmmmmmmm]]></dc:creator><pubDate>Sun, 23 Sep 2012 11:41:19 GMT</pubDate></item><item><title><![CDATA[Reply to error C2664: &#x27;std::make_pair&#x27;: Konvertierung des Parameters 1 von &#x27;physx::PxMaterial *&#x27; in &#x27;physx::PxMaterial *&amp;amp;&amp;amp;&#x27; nicht on Sun, 23 Sep 2012 11:55:30 GMT]]></title><description><![CDATA[<p>Mach mal die Template-Parameter weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253710</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sun, 23 Sep 2012 11:55:30 GMT</pubDate></item><item><title><![CDATA[Reply to error C2664: &#x27;std::make_pair&#x27;: Konvertierung des Parameters 1 von &#x27;physx::PxMaterial *&#x27; in &#x27;physx::PxMaterial *&amp;amp;&amp;amp;&#x27; nicht on Sun, 23 Sep 2012 17:24:44 GMT]]></title><description><![CDATA[<p>*recht-geb*</p>
<p>Template-Parameter für Funktionstemplates aus der Standardbibliothek angeben ist (fast immer) böse.</p>
<p>Statt</p>
<pre><code class="language-cpp">std::make_pair&lt;PxMaterial*, PxMaterialTableIndex&gt;(mat-&gt;second, index)
</code></pre>
<p>kannst du</p>
<pre><code class="language-cpp">std::make_pair(mat-&gt;second, index)
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">std::pair&lt;PxMaterial*, PxMaterialTableIndex&gt;(mat-&gt;second, index)
</code></pre>
<p>schreiben. Das ist ja gerade der Witz an std:make_pair, dass du die Typen <em>nicht</em> mit angeben musst! Deswegen gibt es std::make_pair!</p>
<p>Ich möchte darauf hinweisen dass der resultierende Typ nicht map_typ::value_type ist, sondern höchstens dazu konvertierbar. Möchtest du diese Konvertierung sparen, kannst du auch</p>
<pre><code class="language-cpp">std::pair&lt;PxMaterial*const, PxMaterialTableIndex&gt;(mat-&gt;second, index)
</code></pre>
<p>schreiben.</p>
<p>Oder du gehst ganz neue Wege:</p>
<pre><code class="language-cpp">materialIndicesMap.emplace(mat-&gt;second, index);
</code></pre>
<p>Warum funktioniert dein Kram unter C++11 nicht mehr? Weil die Standardbibliothek geändert wurde, und zwar von</p>
<pre><code class="language-cpp">template&lt;class T, class U&gt;
std::pair&lt;T,U&gt; make_pair(T a, U b);
</code></pre>
<p>zu</p>
<pre><code class="language-cpp">template&lt;class T, class U&gt;
std::pair&lt;?,?&gt; make_pair(T &amp;&amp; a, U &amp;&amp; b);
</code></pre>
<p>wobei &amp;&amp; hier für &quot;perfect forwarding&quot; genutzt werden soll. Das hebelst du allerdings aus, wenn du die Template-Parameter selbst bestimmen willst und damit die Template Argument Deduction (TAD) umgehst. Im Wesentlichen ist das hier passiert:</p>
<pre><code class="language-cpp">template&lt;class T&gt; void foo(T   v) {}
template&lt;class T&gt; void bar(T&amp;&amp; r) {}

int main()
{
  int lvalue = 0;
  foo     (lvalue); // ok,  TAD -&gt; T=int
  foo&lt;int&gt;(lvalue); // ok
  bar     (lvalue); // ok,  TAD -&gt; T=int&amp;
  bar&lt;int&gt;(lvalue); // NÖ! r wäre dann ja eine rvalue-Referenz und die
                    // kannst du nicht mit einem lvalue initialisieren.
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2253783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253783</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 23 Sep 2012 17:24:44 GMT</pubDate></item></channel></rss>