создание экземпляра класса во вложенных классах

#c #templates #c 14 #variadic-templates

#c #шаблоны #c 14 #переменные-шаблоны

Вопрос:

У меня следующая проблема:

 template< typename T, size_t N, size_t... N_i >
struct A
{
  // nested class
  template< typename... Ts >
  class B
  {
      //...

      A<T, N_i...>::B< Ts... > operator[]( size_t i )
      {
        A< T, N_i...>::B< Ts... > res{ /* ... */ };

        return res;
      }

      // ...
  };
};
 

К сожалению, компилятор выдает ошибку для « A < T, N_i...>::B < Ts... > res{ /* ... */ }; «. Кто-нибудь знает, как я могу вернуть экземпляр class B (который отличается своими аргументами шаблона от его внешнего class A ) в функции « operator[] » of class B ?

Заранее большое спасибо.

Ответ №1:

Должно быть достаточно добавить a typename before A<T, N_i...> и a template before B< Ts... > .

Я имею в виду

 template< typename T, size_t N, size_t... N_i >
struct A
{
  // nested class
  template< typename... Ts >
  class B
  {
      //...

      typename A<T, N_i...>::template B< Ts... > operator[]( size_t i )
      {
        typename A< T, N_i...>::template B< Ts... > res{ /* ... */ };

        return res;
      }

      // ...
  };
}
 

P.s.: должен работать также с C 11; не только с C 14

Ответ №2:

Установка a typename перед полным типом возвращаемых типов — это то, что исправляет ошибки, которые вы получаете. Однако не ставьте параметры шаблона после B, поскольку B всегда ссылается на «текущий» экземпляр типа.

 #include <stdio.h>
using namespace std;

template< typename T, size_t N, size_t... N_i >
struct A
{
  // nested class
  template< typename... Ts >
  class B
  {
      //...

      typename A<T, N_i...>::B operator[]( size_t i )
      {
        typename A< T, N_i...>::B res{ /* ... */ };

        return res;
      }

      // ...
  };
};
 

https://godbolt.org/g/hsB4pW

Комментарии:

1. извините, но я не уверен, что понимаю; operator[] в вашем ответе возвращается что? An A<T, N, N_i ...>::B<Ts...> или an A<T, N_i...>::B<Ts...> ? Если я правильно понимаю, ОП запрашивает A<T, N_i...>::B<Ts...>

2. еще раз извините: с «Помещением a namespace перед полным типом» вы имеете в виду «Помещение a typename перед полным типом»?