Потому что нетипичные параметры шаблона требуют значений во время компиляции. Помните, что шаблоны - это механизм времени компиляции; шаблоны не существуют в конечном исполняемом файле. Также помните, что функции и передача аргументов функциям являются механизмами времени выполнения. Значение параметра j
в run()
не будет известно до тех пор, пока программа не запустится и не вызовет функцию run()
, прошедшую после этапа компиляции.
void run(const int j)
{
// The compiler can't know what j is until the program actually runs!
MyTemplate<j> b;
}
const int i = 3;
run(i);
Именно поэтому компилятор говорит, что «j» не может появляться в константном выражении ».
С другой стороны, это нормально, потому что значение i
известно во время компиляции.
const int i = 3;
// The compiler knows i has the value 3 at this point,
// so we can actually compile this.
MyTemplate<i> a;
Вы можете передавать значения времени компиляции в конструкции времени выполнения, но не наоборот.
Однако вы можете сделать так, чтобы ваша функция run()
принимала параметр шаблона нетипичного типа так же, как ваш шаблонный класс MyTemplate
принимает параметр шаблона нетипичного типа:
template<int j>
void run()
{
MyTemplate<j> b;
}
const int i = 3;
run<i>();