Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2020-04-09T19:26:10+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Variable template dans une class template, message #2186532020-04-09T19:26:10+02:00mehdidou99/@mehdidou99https://zestedesavoir.com/forums/sujet/13885/variable-template-dans-une-class-template/?page=1#p218653<p>EDIT : Problème réglé, j’aurais dû tester avec Clang avant de poser la question. Clang m’a donné un message beaucoup plus explicite, et en fait le comportement est tout à fait normal : il manque le mot-clé <code>template</code> pour expliciter au compilateur que <code>value</code> est une variable template :</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span></div><pre><code class="hljs language-C++"><span class="hljs-keyword">return</span> X<T>::<span class="hljs-keyword">template</span> value<U>;
</code></pre></div>
<hr>
<p>Salut les agrumes,</p>
<p>Lors de manipulations obscures je me suis rendu compte d’un comportement très étrange, que je vais illustrer avec le programme minimal suivant :</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-C++"><span class="hljs-keyword">template</span><<span class="hljs-keyword">typename</span> T>
<span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">X</span>
{</span>
<span class="hljs-keyword">template</span><<span class="hljs-keyword">typename</span> U>
<span class="hljs-keyword">static</span> <span class="hljs-keyword">constexpr</span> <span class="hljs-keyword">auto</span> value = <span class="hljs-number">5</span>;
};
<span class="hljs-keyword">template</span><<span class="hljs-keyword">typename</span> T, <span class="hljs-keyword">typename</span> U>
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">foo</span><span class="hljs-params">()</span>
</span>{
<span class="hljs-keyword">return</span> X<T>::value<U>;
}
</code></pre></div>
<p>Eh bien ce code ne compile pas ! On a une erreur du lexer concernant la ligne 11 :</p>
<blockquote>
<p>error: expected primary-expression before '>' token</p>
</blockquote>
<p>J’étais très étonné de ce comportement, et visiblement il n’aime pas ce genre de construction dès lors que le type avec lequel on instancie le template <code>X</code> est lui-même un type générique. Voyez plutôt :</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-C++"><span class="hljs-comment">// Exemple précédent :</span>
<span class="hljs-keyword">return</span> X<T>::value<<span class="hljs-keyword">float</span>>; <span class="hljs-comment">// error: expected primary-expression before '>' token</span>
<span class="hljs-comment">// Second type non générique :</span>
<span class="hljs-keyword">return</span> X<T>::value<<span class="hljs-keyword">float</span>>; <span class="hljs-comment">// error: expected primary-expression before 'float'</span>
<span class="hljs-comment">// Premier type non générique :</span>
<span class="hljs-keyword">return</span> X<<span class="hljs-keyword">int</span>>::value<<span class="hljs-keyword">float</span>>;
<span class="hljs-keyword">return</span> X<<span class="hljs-keyword">int</span>>::value<U>; <span class="hljs-comment">// OK !</span>
</code></pre></div>
<p>Est-ce que quelqu’un a une explication à ce comportement étrange ? Je n’ai rien trouvé qui puisse l’expliquer en feuilletant la doc.</p>
<p>N.B : Je n’ai testé de compiler qu’avec gcc, j’essaierai au plus vite avec un autre compilateur au cas où c’est un bug du compilo.</p>