devrais-je écrire:Le nom de fichier doit-il être avant ou après const dans C++?
template<class T> class Foo {
typename const T* x;
};
ou:
template<class T> class Foo {
const typename T* x;
};
devrais-je écrire:Le nom de fichier doit-il être avant ou après const dans C++?
template<class T> class Foo {
typename const T* x;
};
ou:
template<class T> class Foo {
const typename T* x;
};
typename
n'est pas utilisé comme ça, alors les deux cas ne sont pas valides et devraient produire une erreur de compilation, comme ceci:
main.cpp:4:20: error: expected a qualified name after 'typename'
const typename T* x;
^
Ici, vous aurez besoin de quelque chose comme T::myType
pour continuer.
Ou même ce qui est pire:
main.cpp:4:14: error: expected a qualified name after 'typename'
typename const T* x;
^
main.cpp:4:14: error: expected member name or ';' after declaration specifiers
exemple pertinent dans expected a qualified name after 'typename'.
Le typename mot-clé a été introduite pour indiquer que l'identifiant qui suit est un type
En savoir plus: Officially, what is typename for?
typename
doit aller avec le type de votre essaient de obtenir. Par exemple, si vous avez
template <typename T>
void foo(T& t)
{
typename const T::iterator bar = t.begin();
}
int main()
{
std::vector<int> bar{1,2,3}
foo(bar);
}
Vous obtiendrez une erreur de compilateur pour typename const T::const_iterator bar = t.begin();
le long des lignes de
attendue nom-spécificateur imbriqué avant 'const'
Où que
const typename T::iterator bar = t.begin();
Fonctionne très bien.
Pour une explication complète sur quand, où, et pourquoi template
et typename
besoin d'apparaître voir: Where and why do I have to put the "template" and "typename" keywords?
Il n'y a pas d'intérêt à utiliser typename
ici.
Vous devez utiliser si vous souhaitez accéder à un type d'alias comme T::type
où vous ne pouvez pas avoir const
entre typename
et T::type
const typename T::type * x; // ok
typename T::type const * x; // ok
typename const T::type * x; // error
est 'typename' même permis dans ce cas? Je pensais qu'il était utilisé seulement pour désambiguïser la syntaxe pour les membres de données statiques et les types de membres. –
Si l'un d'entre eux provoque une erreur de compilation, c'est celui que vous ne devriez pas utiliser. – molbdnilo
Simplement: 'modèle classe Foo { const T * x = nullptr; }; ' –
Jarod42