tutorial studio programacion móviles libro español desarrollo desarrollar curso aprende aplicaciones c++ templates syntax compiler-errors class-method

c++ - studio - ¿Por qué la compilación falla cuando un nombre de parámetro de plantilla coincide con un nombre de clase interno?



programacion android pdf 2018 (0)

Siguiendo compila perfectamente bien:

struct MyClass { template<typename SameName> void foo (SameName* p); }; struct SameName {}; template<class SameName> void MyClass::foo (SameName* p) {}

Sin embargo, si incluimos MyClass y SameName dentro de una class Outer , la función de template definida en el exterior no se compila.

struct Outer { /* paste here `MyClass` & `SameName` from above */ }; template<class SameName> void Outer::MyClass::foo (SameName* p) {} // <--- error here // ^^^^^

El error g ++ (03-14) es raro:

error: prototype for ‘void Outer::MyClass::foo(Outer::SameName*)’ does not match any in class ‘Outer::MyClass’ void Outer::MyClass::foo (SameName* p) {} ^~~~~ templateClassMethod.cpp:6:10: error: candidate is: template<class SameName> void Outer::MyClass::foo(SameName*) void foo (SameName* p);

El error clang (03-14) es menos intuitivo:

error: out-of-line definition of ''foo'' does not match any declaration in ''Outer::MyClass'' void Outer::MyClass::foo (SameName* p) {}

Pregunta :

  • ¿Es esto un error del lenguaje / compilador o un comportamiento esperado?
  • Si se espera, ¿por qué la elección del nombre del tipo de template está restringida para las clases internas?

[Nota: en realidad tenía muchos parámetros de plantilla, y por cierto, uno de ellos coincidía con el nombre de la clase interna, por casualidad. Me llevó 1 hora averiguarlo. El error generado en ese escenario complejo fue totalmente engañoso.]