2016-09-07 1 views
6

Prenons l'exemple suivant:g ++ - 6 erreurs sur les paramètres du modèle ombrées en g ++ - 5 ne pas

#include <vector> 

template <typename T, template <class T> class Container> 
std::vector<T> To_Vector(Container<T> const& c){ 
    return std::vector<T>(c.begin(), c.end()); 
} 

int main(){} 

Avec g++-5, il compile sans erreur:

Avec g++-6 est ne réussit pas à compiler :

g++-6 -o main main.cpp 
main.cpp:4:33: error: declaration of template parameter ‘T’ shadows template parameter 
template <typename T, template <class T> class Container> 
           ^~~~~ 
main.cpp:4:11: note: template parameter ‘T’ declared here 
template <typename T, template <class T> class Container> 

Le compilateur est-il incorrect? Mon code est-il faux?
Pourquoi g++-5 compile ce code alors que g++-6 ne le fait pas?


g++-5 --version  
g++-5 (Ubuntu 5.4.1-2ubuntu1~14.04) 5.4.1 20160904 
Copyright (C) 2015 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

g++-6 --version 
g++-6 (Ubuntu 6.2.0-3ubuntu11~14.04) 6.2.0 20160901 
Copyright (C) 2016 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+0

@skypjack Ok, donc je devrais omettre le 'T' dans , parce que juste construit pour moi. –

+0

C'est une solution valide et fonctionnelle. Ce 'T 'est inutile dans votre exemple, n'est-ce pas? – skypjack

+0

@skypjack Vous avez raison. J'ai dû être confus en pensant que le nom du type de conteneur devait être spécialisé sur le type T, mais cela se produit sur les paramètres réels. –

Répondre

4

Le comportement de g ++ 6 est correct, car conformément à la norme:

Un modèle-paramètre ne doit pas être redéclarée dans son cadre (y compris les portées imbriquées). Un paramètre de modèle ne doit pas avoir le même nom que le nom du modèle.

Le champ d'T commence juste après sa déclaration, il se prolonge dans le paramètre de modèle de modèle suivant, qui redéclare T comme paramètre de modèle, par conséquent, cette règle est violée.

J'imagine que le changement entre g ++ 5 et g ++ 6 était dû à la correction d'un rapport de bug autour d'un problème similaire.

+0

Pourquoi cela fonctionne-t-il à la place? 'template