2017-05-10 2 views
2

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; 
}; 
+3

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. –

+3

Si l'un d'entre eux provoque une erreur de compilation, c'est celui que vous ne devriez pas utiliser. – molbdnilo

+0

Simplement: 'modèle classe Foo { const T * x = nullptr; }; ' – Jarod42

Répondre

3

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?

1

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?

0

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