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?

questionAnswers(1)

yourAnswerToTheQuestion