Ваш вопрос несколько сбивает с толку. Сначала я подумал, что вы спрашиваете о base<Type>
в списке инициализации члена, затем я подумал, что вы спрашиваете о доступе к member
, затем снова к первому ... Теперь я думаю, что вы спрашиваете обоим, поэтому я отвечу на оба.
Не пишет Type здесь выдает ошибку, почему?
Когда вы используете имя шаблона класса (my_class_templ
), оно ссылается на шаблон , который не является типом. Чтобы использовать его как тип, вам необходимо предоставить параметры шаблона (my_class_templ<int>
, my_class_templ<T>
). Поэтому, где бы ни требовалось имя типа (включая имена базовых классов в списке инициализации), вы должны предоставить параметры шаблона.
Вы можете опустить список параметров шаблона для имен шаблонов классов в пределах определения шаблона класса. Например, конструктор копирования может быть объявлен как
my_class_templ(const my_class_templ& rhs);
вместо
my_class_templ<T>(const my_class_templ<T>& rhs);
Это просто немного синтаксического сахара, позволяющего печатать меньше.
Однако, вне определения шаблонов классов, вам нужно явно прописать все параметры шаблона. Это также верно для производных классов:
my_dervied_class_templ(const my_derived_class_templ& rhs)
: my_class_templ<T>(rhs) // need to spell out <T> here
{
}
Я получаю ошибку 'member' was not declared in this scope
. Как исправить проблемы?
Когда ваш шаблон встречается компилятором первым, есть только его определение, и компилятор еще не видел его экземпляров. Компилятор не знает, могут ли в момент создания быть специализации шаблона в области видимости или нет. Тем не менее, вы могли бы специализировать свой шаблон для Base<T>::member
, чтобы ссылаться на что-то другое или не определять полностью. (Скажем, специализация Base<void>
не имеет элемента данных.) Следовательно, компилятор не должен рассуждать о членах Base
. Следовательно, они не будут найдены в Derived
.
В результате этого, если вам нужно обратиться к одному из членов Base
, вам нужно сообщить компилятору, что вы ожидаете, что Base<T>
будет иметь такого члена. Это делается путем полной квалификации его имени: Base<Type>::member
.