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