Je regardais cette question trouve ici Template function overload for type containing a typeFonction Modèle de surcharge Résolution et Optimisations du compilateur
Lorsque l'OP user2079802 fourni ce code pour son/sa question:
Je suis en train de faire ce qui suit :
#include <iostream> #include <vector> #include <tuple> template <typename T> void f(T t) { std::cout << "1" << std::endl; } template <typename T, typename V> void f(T<std::tuple<V>> t) { std::cout << "2" << std::endl; } int main() { f(std::list<double>{}); // should use first template f(std::vector<std::tuple<int>>{}); // should use second template }
Quelle est la manière la plus simple de faire cela en C++ 14? Je pensais que je pourrais trier des motifs de cette façon, mais le compilateur ne l'aura pas.
Et songyuanyao fourni cette réponse:
Le paramètre modèle
T
est utilisé comme modèle nom, il devrait donc être déclarée comme template template parameter. par exemple.template <template <typename...> class T, typename V> // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void f(T<std::tuple<V>> t) { std::cout << "2" << std::endl; }
La réponse qui a été fournie a effectivement corriger les erreurs de compilation et le code ne fonctionne correctement. Je pose une question sur cet extrait de code pour plus de clarté. L'OP essayait à l'origine de modéliser les types de gabarit mais avait une syntaxe incorrecte pour les paramètres de gabarit de gabarit. Quand je courais la réponse dans mon IDE, compilateur & Debugger {MSVS 2017 CE} en cours d'exécution sur un 64bit Intel machine Windows 7 J'arrive de remarquer que, dans la fonction de l'OP appelle dans leur fonction principale:
f(std::list<double>{}); f(std::vector<std::tuple<int>>{});
Que l'appel de la 2ème fonction appelle en fait le 1er modèle de fonction et non le 2ème. Cela soulève quelques questions:
- Est-ce que cela se produit en raison des optimisations du compilateur?
- Est-ce le résultat d'une résolution de surcharge?
- Que se passe-t-il réellement sous le capot du compilateur quand choisit d'utiliser le premier modèle de fonction sur le 2ème?
- Ou est-ce un bug avec le compilateur MSVC?
Eh, obtenez-vous la sortie "1 2"? Ou en tirez-vous cette conclusion "l'appel de 2ème fonction appelle en fait le 1er modèle de fonction" de ce que vous voyez dans le débogueur? –
@DanielJour Je reçois une valeur imprimée de '1' au lieu de' 2', donc elle appelle la 1ère fonction et non la 2ème. –
C'est un bogue dans le compilateur MSVC. –