Странные имена и конструкторы в шаблоне

Я пытаюсь понять шаблон класса в C ++. Во-первых, я хотел бы понять, что означает эта строка:

template <typename T, typename Ord = columns, typename All = abc::allocator<T,16> >
class matrix

где столбцы и распределитель являются соответственно структурой и классом, определенным где-то еще (второй в пространстве имен abc). Что меня беспокоит, так это тот факт, что у него есть имя, которое уже было инициализировано. Что это значит? Должен ли я также инициализировать имя типа Ord и All, когда я хочу использовать этот шаблон?

Кроме того, есть также этот единственный конструктор:

explicit matrix(unsigned int rows = 0, unsigned int cols = 0, T init = T())

но, похоже, он уже был инициализирован. А что должно означать init?

Уверяю вас, что я посмотрел весь код, но нет ничего, что помогает лучше понять. Спасибо за Ваше внимание.

Изменить: Спасибо всем за ваши ответы. Просто небольшое заверение (я нуб в C ++):

int const& operator() operator()(unsigned int i, unsigned int j) const

Этот метод означает, что когда мы инициализируем класс foo, мы можем вызвать его с помощью foo () (1,2), где i = 1 и j = 2. Я прав? И что означают два «const»?

Еще раз спасибо!

0

Решение

template <typename T, typename Ord = columns, typename All = abc::allocator<T,16> >
class matrix
{
//...
};

Это параметры шаблона по умолчанию, они работают как аргументы функций по умолчанию — вы можете указать их, но если вы этого не сделаете, они по умолчанию.

И вы можете увидеть пример использования стандартных аргументов функции.


Итог — все следующие строки верны:

matrix<int> a; // matrix<int, columns, abc::allocator<int, 16> >
matrix<int, rows> b; // matrix<int, rows, abc::allocator<int, 16> >
matrix<int, columns, abc::other_allocator<int, 32> > c; // obvious

matrix<int> a = matrix<int>(); // constructor called with 0, 0 and
// int() - default constructed T - in this case, int -  as arguments
matrix<int> a(1, 2); // constructor called with 1, 2 and int() as arguments
matrix<int> a(1, 2, 100); // obvious
1

Другие решения

Это означает, что пользователь класса установил разумное значение по умолчанию — например, вы Можно предоставить один, но вы не иметь к. То же самое относится и к аргументам конструктора. Что касается аргументов, только вы можете ответить на это.

1

Это значение по умолчанию. Если аргумент шаблона не указан, он будет принят по умолчанию.
Также как у вас есть значения по умолчанию в функциях:

void blah(int a = 0) { }
0

Как вы знаете, в C ++ аргументы функций могут иметь значения по умолчанию, и в случае, если пользователь не предоставляет эти параметры, компилятор C ++ использует для них это значение по умолчанию.
Сейчас в конструкторе init имеет значение по умолчанию T() что означает значение типа, используя его конструктор по умолчанию, например, если T=int затем T() имею в виду 0 и если это std::string это пустая строка. Вы даже можете использовать этот синтаксис для других параметров:

explicit matrix(
unsigned int rows = unsigned int(),
unsigned int cols = unsigned int(),
T init = T());
0
По вопросам рекламы [email protected]