Вложенные шаблоны классов: значение параметра по умолчанию не принято - PullRequest
4 голосов
/ 08 октября 2019

Это компилируется:

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

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

int main() {}

Это не:

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 говорит: (версия 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 {
      |             ^

Что не так?

1 Ответ

7 голосов
/ 08 октября 2019

Параметр по умолчанию должен быть в объявлении:

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;
}

Параметры по умолчанию недопустимы

в определении внеклассного элемента члена шаблона класса(они должны быть указаны в объявлении внутри тела класса). Обратите внимание, что шаблоны элементов не шаблонных классов могут использовать параметры по умолчанию в своих определениях вне класса (см. Ошибку GCC 53856)

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

...