OVH Cloud OVH Cloud

spécialisation et namespaces

11 réponses
Avatar
Cyril Poupon
Bonjour,

Le morceau de code suivant ne compile pas avec le compilateur GCC 3.4.2. Il
compile cepedant avec les compilateurs de Sun, SGI et GCC 3.3 et 3.5. Je me
demdande donc si c'est un bug du compilateur ou une nouvelle subtilité de
la norme C++ :

namespace nmr {
template <class T> void helper();
}
template <class T> void nmr::helper() {
}
template <> void nmr::helper<char>() {
}


Le message d'erreur est :

foo.cc:7: error: specialization of `template<class T> void nmr::helper()' in
different namespace
foo.cc:5: error:   from definition of `template<class T> void nmr::helper()'

--
Cyril

1 réponse

1 2
Avatar
Jean-Marc Bourguet
Falk Tannhäuser writes:

AMA, ce que dit § 14.7.3/2, c'est que les 2 variantes de définir
'foo::bar<42>::toto()' sont légales. En revanche, la spécialisation
explicite de la classe 'bar' ne pourrait pas apparaître au niveau
du namespace global, comme
template<> struct foo::bar<42> { void toto(); };


Dans cju7j5$8no$ tu avais l'air de dire que
la definition devait aussi se trouver dans le namespace. Maintenant
que tu ecris que tant qu'une declaration prealable s'y trouve, la
definition peut se trouver dans un namespace englobant nous sommes
d'accord.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

1 2