2010-07-15 2 views

ответ

3

Существует два синтаксиса для обозначения типов массивов. Первым из них является типа идентификатор синтаксиса и используется везде, где язык ожидает компиляции тип времени, который выглядит как:

T[constant-expression] 
T[] 

Это указывает тип массива, который, в первой форме, имеет ряд элементов, заданных целочисленным постоянным выражением (означает, что он должен быть известен во время компиляции). Во второй форме он задает тип массива с неизвестным количеством элементов. Подобно типам классов, которые вы объявляете без тела, такой тип массива называется неполным, и вы не можете создавать массивы этого типа

// not valid: what size would it have? 
int a[]; 

Вы можете, однако, указать этот тип. Например, вы можете определение типа во его

typedef int unknown_int_array[]; 

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

Второй способ использует нового типа ID- синтаксис, который позволяет обозначающие типы времени выполнения при наличии непостоянной границы изменений

T[expression] 

Это позволяет прохождение переменных в качестве счетчика элементов, а также позволяет пропускание ноль. В этом случае создается массив нулевых элементов. Этот синтаксис можно использовать только с оператором new для поддержки динамических массивов.

0

Синтаксис объявления массивов

<type> <variable>[<size>]; 

При использовании шаблона в декларации есть, в примере

template <class T> 
    T var[4]; 
5

Тип "массив типа T": T [dimension], что вы можете передать в качестве параметров шаблона. Например:

someTemplate<int [10]> t; // array type as template parameter 
int a[5]; // array of 5 ints named 'a' 

Массивы должны иметь размер, который должен быть больше 0. Это означает, что, например, U u[]; является незаконным.

Есть случаи, которые могут показаться как исключения, первые параметры которых являются:

void f(T[]); 

Это специальное правило для параметров и f() фактически эквивалентно следующему:

void f(T*); 

Тогда является прямым инициализацией массивов:

int a[] = { 1, 2, 3, 4 }; 

Здесь t размер массива неявно задается через количество элементов в инициализаторе, поэтому тип a равен int[4].

Есть также неполных типов массивов без specificied границ, но вы не можете напрямую создавать экземпляры этих (см Johannes ответа на более):

template<class T> struct X { typedef T type; }; 
X<int[]>::type a = { 1, 2, 3 }; 

Если вы ищете динамические массивы, предпочитает стандартные контейнеры, такие как std::vector<T>.

+0

So T ; Недействительный код? – user383352

+0

Как насчет int [] someArray ;? – user383352

+3

Нет, это неверно. –

2

Если возможно, вы можете вместо этого использовать динамические массивы и передавать указатель в качестве шаблонного типа. Такие, как ...

T<int*> myVar; 
1

Это началось как комментарий к ответу Георга, но он побежал немного долго ...

кажется, что вы можете упустить некоторые ключевые абстракции в вашей мысленной модели массивов (по крайней мере, в стиле C). Локальные массивы выделяются в стеке с жестко кодированным размером. Если у вас есть массив внутри класса или структуры, пространство для массива является частью самого объекта (будь то в стеке или куче). Глобальные массивы могут даже отображаться непосредственно в размере исполняемого файла.

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

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

Смежные вопросы