Передача значений во внутренний класс с помощью аргументов шаблона C

#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 Я думаю, что это другой вопрос, и вам нужно задать его в другом сообщении (если не найдете ответа в Интернете). Кроме того, пожалуйста, подумайте о принятии ответа, если он решит вашу проблему. При создании нового сообщения укажите мне, и я сделаю все возможное, чтобы объяснить