 <p>In:</p> <pre><code>template &lt;typename T&gt; void Method1(T&amp;&amp; a); </code></pre> <p><code>T&amp;&amp;</code> is a <em>forwarding-reference</em>, rather than an <em>rvalue reference</em>.</p> <p>Now, the call:</p> <pre><code>classA.Method1(a); </code></pre> <p>deduces <code>T</code> to be <code>double&amp;</code>. The explicit instantiation you provide:</p> <pre><code>template void ClassA::Method1&lt;double&gt;(double&amp;&amp;); </code></pre> <p>is only for <em>rvalue</em> expressions. This is why it compiles and links when you turn <code>a</code> into an <em>xvalue</em> (a kind of an rvalue) with <code>std::move</code>.</p> <p>Try the following explicit instantiation:</p> <pre><code>template void ClassA::Method1&lt;double&amp;&gt;(double&amp;); </code></pre> <p>Still, you don't cover all possibilities a forwarding reference can take, so better move the implementation of <code>Method1</code> to a header file with the class definition.</p>