ocultando o parâmetro de modelo do modelo de membro
detemp.local :
Na definição de um membro de um modelo de classe que aparece fora da definição de modelo de classe, o nome de um membro do modelo de classe oculta o nome de um parâmetro de modelo de qualquer modelo de classe envolvente (mas não um parâmetro de modelo do membro, se o membro for um modelo de classe ou função) [Exemplo:
template<class T> struct A {
struct B { /* ... */ };
typedef void C;
void f();
template<class U> void g(U);
};
template<class B> void A<B>::f() {
B b; // A's B, not the template parameter
}
template<class B> template<class C> void A<B>::g(C) {
B b; // A's B, not the template parameter
C c; // the template parameter C, not A's C
}
- exemplo final]
o problema é que, cada compilador, que eu tentei (g ++, vc, icc, clang), trata C emA<B>::g(C)
como o nome de membro de A e não compila esse exemplo.
Isso é um bug comum?