#c #class #templates
#c #класс #шаблоны
Вопрос:
Пытаюсь передать значение во вложенный класс с помощью шаблона agrument, и возникает некоторая путаница:
template<typename A,typename B>
class outter{
int a;
T* p;
////...////
template<typename N=int> class inner;
inner do_something(){
return inner<a>(p)
}
}
template<typename T,typename A, typename N=int>
class outter<T,A>::inner<N>{
sz=N;
}
Задача состоит в том, чтобы создать итератор для вектора с контролем диапазона.
На данный момент я застрял в объявлении шаблона внутреннего класса и передаче аргументов. Пожалуйста, мне нужно заранее, если это возможно. Спасибо!
Комментарии:
1. При
template<typename N=int> class inner
объявлении этоN
тип , а не значение. Кроме того, templates — это чистая конструкция compile.time, вы не можете передавать какое-либо значение времени выполнения (например, обычную переменную) в качестве аргумента шаблона.
Ответ №1:
Для внутреннего класса у вас есть template <typename N>
, что означает, что ваш N
тип, а не значение, следовательно, вы не можете присвоить его значению.
Чтобы решить вашу проблему, попробуйте иметь template <int N> class inner;
, а также исправить таким же образом внизу template<typename T, typename A, int N>
Редактировать
Просто заметил, что внизу у вас есть определение внутреннего класса. Что вы хотите, чтобы это sz
было? это значение или тип? Если вы хотите, чтобы это было значением, вы должны написать
template<typename T,typename A, int N> // this last int determines also the type to be used down below v
class outter<T,A>::inner<N>{
int sz=N; // this int comes from the upper side ^
}
Если вы хотите sz
, чтобы это был тип, определяющий размеры внутри внутреннего класса, тогда оставьте верхнюю и нижнюю части равными <..., typename N = int>
и поместите using
перед sz=N;
template<typename T,typename A, typename N=int>
class outter<T,A>::inner<N>{
using sz=N;
}
Если вы хотите, чтобы N
тип и значение указывались с помощью шаблонов, пожалуйста, следуйте этому примеру:
template </*outer template params*/>
class outer {
template <typename SIZE_TYPE, SIZE_TYPE VALUE = SIZE_TYPE()>
class inner;
};
template </*outer template params*/, typename SIZE_TYPE, SIZE_TYPE VALUE = SIZE_TYPE()>
class outer</*params*/>::inner<SIZE_TYPE, VALUE> {
using size_type = SIZE_TYPE;
size_type my_value = VALUE;
}
Редактировать 2
Если вы хотите понять, что здесь происходит, пожалуйста, прочитайте больше о создании экземпляра шаблона.
Комментарии:
1. Не помогает. Ключевая ошибка: Описание кода серьезности Ошибка состояния подавления строки файла проекта C2992 вектор <T, A> :: итератор <N>: недопустимый или отсутствующий шаблон списка параметров Мое объявление класса на данный момент:
template<typename A,typename B> class outter{ int a; T* p; ////...//// template<int N> class inner; inner do_something(){ return inner<a>(p) } } //outter declaration template<typename T,typename A, int N> class outter<T,A>::inner<N>{ sz=N; }
2. Спасибо за ваш ответ. Мне нужно сначала. Просто пытаюсь передать значение из внешнего класса во внутренний класс через аргументы шаблона, если это возможно. Да, пытаюсь с помощью вашего первого редактирования, но все еще есть ошибки, подобные сверху. Конечно, я могу реализовать свой случай, передавая значения с помощью аргумента конструктора, но шаблоны, которые являются очень общими, сейчас очень интересны для меня. Возможно ли передать значение из внешнего класса во внутренний класс через аргумент шаблона?
3. @c_thief Я думаю, что это другой вопрос, и вам нужно задать его в другом сообщении (если не найдете ответа в Интернете). Кроме того, пожалуйста, подумайте о принятии ответа, если он решит вашу проблему. При создании нового сообщения укажите мне, и я сделаю все возможное, чтобы объяснить