Pourquoi ne enable_if_t dans les arguments de modèle se plaint des redéfinitions?
J'ai le cas suivant qui fonctionne à l'aide std::enable_if
:
template<typename T,
typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }
template<typename T,
typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }
Maintenant, j'ai vu dans cppreference la nouvelle syntaxe, beaucoup plus propre à mon avis : typename = std::enable_if_t<std::is_same<int, T>::value>>
Je voulais de port mon code :
template<typename T,
typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }
template<typename T,
typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }
Mais maintenant GCC (5.2) se plaint :
error: redefinition of 'template<class T, class> void g()'
void g() { }
Pourquoi donc ? Que puis-je faire pour avoir le nouveau, la syntaxe plus concise dans ce cas, si cela est possible ?
Votre deuxième code, utilise le modèle par défaut arguments. Ils ne font pas partie de la signature de la fonction, d'où vous êtes déclarant deux modèles de fonction avec la même signature = redéfinition. L'utilisation correspondante de
Eh bien, vous n'avez pas de réécrire votre code d'origine exactement. Vous avez oublié le
Vous pouvez ajouter un mannequin paramètre de modèle à l'un des déclarations, comme
Je pense que vous pouvez mettre votre commentaire comme une réponse ! @KerrekSB: non, c'est le point de
Vous n'avez pas besoin de la
enable_if_t
est littéralement std::enable_if_t<std::is_same<int, T>::value>* = nullptr
.Eh bien, vous n'avez pas de réécrire votre code d'origine exactement. Vous avez oublié le
* = nullptr
.Vous pouvez ajouter un mannequin paramètre de modèle à l'un des déclarations, comme
, typename = void
après enable_if
Je pense que vous pouvez mettre votre commentaire comme une réponse ! @KerrekSB: non, c'est le point de
enable_if_t
@PiotrS. : okVous n'avez pas besoin de la
typename
en face de std::enable_if_t
. Plus de caractères acquis.
OriginalL'auteur Jean-Michaël Celerier | 2015-07-19
Vous devez vous connecter pour publier un commentaire.
Nous allons les supprimer du code.
seriez-vous surpris si le compilateur a rejeté les deux modèles ci-dessus?
Ils sont à la fois modèle de fonctions de "type"
template<class,class>void()
. Le fait que le 2e argument de type a une autre par défaut valeur est sans importance. Ce serait comme s'attendent à deux différentsprint(string, int)
fonctions différentes par défautint
valeurs de surcharge. 😉Dans le premier cas, nous avons:
ici nous ne pouvons pas supprimer la
enable_if
clause. La mise à jour deenable_if_t
:J'ai aussi remplacé une utilisation de
typename
avecclass
. Je soupçonne votre confusion était parce quetypename
a deux significations -- comme un marqueur pour un type detemplate
argument, et l'autre comme un disambiguator pour un type de charge.Ici le 2e argument est un pointeur, dont le type dépend de la première. Le compilateur ne peut pas déterminer si ces deux conflits sans d'abord la substitution dans le type
T
-- et vous remarquerez qu'ils ne seront jamais en conflit.OriginalL'auteur Yakk - Adam Nevraumont
enable_if_t<B>
est juste un alias pourtypename enable_if<B>::type
. Nous allons remplacer que dansg
afin que nous puissions voir la vraie différence entref
etg
:Dans le cas de
f
, nous avons deux modèles de fonction à la fois avec les paramètres de modèle<typename, X*>
, où le typeX
est dépendante sur le type du premier modèle argument. Dans le cas deg
nous avons deux modèles de fonction avec les paramètres de modèle<typename, typename>
et c'est seulement le modèle par défaut de l'argument qui est dépendante de C++ considère qu'ils sont à la fois de déclarer la même entité.Le style peut être utilisé avec le
enable_if_t
alias:Pas de problème, Yakk l'explication est un peu mieux.
OriginalL'auteur Oktalist
Pour un type de retour de fonction, vous êtes à la recherche pour les éléments suivants:
Exemple:
http://ideone.com/TB36gH
voir aussi
http://ideone.com/EfLkQy
OriginalL'auteur kfsone
Il vous manque un "::tapez" ..
std::enable_if_t
est un alias du modèle de imbriquée::type
définition destd::enable_if
OriginalL'auteur themoondothshine