#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;
}
// ...
};
};
Комментарии:
1. извините, но я не уверен, что понимаю;
operator[]
в вашем ответе возвращается что? AnA<T, N, N_i ...>::B<Ts...>
или anA<T, N_i...>::B<Ts...>
? Если я правильно понимаю, ОП запрашиваетA<T, N_i...>::B<Ts...>
2. еще раз извините: с «Помещением a
namespace
перед полным типом» вы имеете в виду «Помещение atypename
перед полным типом»?