Esto compila:

class A {
public:
  template <int, int> class B;
};

template <int y, int z = y>
class A::B {
};

int main() {}

Esto no:

template <int x>
class A {
public:
  template <int, int> class B;
};

template <int x>
template <int y, int z = y>
class A<x>::B {
};

int main() {}

g++ main.cpp dice: (versión 9.1.0)

main.cpp:24:13: error: default argument for template parameter for class enclosing ‘class A<x>::B<<anonymous>, <anonymous> >’
   24 | class A<x>::B {
      |             ^

¿Qué pasa?

5
feklee 8 oct. 2019 a las 22:24

1 respuesta

La mejor respuesta

El parámetro predeterminado debe estar en la declaración:

template <int x>
class A {
public:
  template <int y, int = y> class B;
};

template <int x>
template <int y, int z>
class A<x>::B {
};

int main() {
    A<1>::B<2> b;
}

Los parámetros predeterminados no están permitidos en la definición fuera de clase de un miembro de una plantilla de clase (deben proporcionarse en la declaración dentro del cuerpo de la clase). Tenga en cuenta que las plantillas de miembros de clases que no son de plantilla pueden usar parámetros predeterminados en sus definiciones fuera de clase (consulte el error 53856 de GCC)

( https://en.cppreference.com/w/cpp/language/template_parameters)

7
OznOg 5 may. 2020 a las 19:53