C ++, непараметрические типы для шаблонов: только константные переменные? - PullRequest
1 голос
/ 22 сентября 2011

Я не понимаю, почему параметр шаблона может быть инициализирован только с помощью переменной const. Например, почему не работает следующий код:

#include <iostream>
template <class T,int dim>
class Vec
{
    T _vec[dim];
    int _dim;
    public:
    Vec () : _dim(dim) {};
    ~Vec () {};
    // other operators and stuff
};
int main () {
   int dim = 3;
   Vec < int, dim> vecInt3;
}

Если я добавлю const к определению dim в основном, все в порядке. Почему это так?

Ответы [ 4 ]

3 голосов
/ 22 сентября 2011

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

0 голосов
/ 22 сентября 2011

Поскольку параметр шаблона должен быть рассчитан во время компиляции.Компилятор создаст коды для различных параметров.

В вашем случае вы можете видеть, что если dim не является константой, компилятор не будет знать, сколько места следует выделить для vecInt3.На самом деле Vec<int, 1> и Vec<int, 2> - это разные типы.

Если вы хотите вектор с динамическим размером, вы можете увидеть std::vector, чтобы получить представление.

0 голосов
/ 22 сентября 2011

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

После этого код должен работать, если нет других синтаксических ошибок.

AnВажное замечание, прежде чем сходить с ума: вы не можете разбивать шаблоны в файле header / cpp, вы должны написать заголовок и реализацию в одном файле!

0 голосов
/ 22 сентября 2011

Я думаю, это потому, что вы не можете создать таблицу с переменной длиной T _vec[dim]. Почему бы не подумать о встроенном векторном типе вместо этого?

...