Аргумент для нетипичного параметра шаблона должен быть константное выражение .
int* a = new int(5);
В этом фрагменте a
не является константным выражением и не подходит для шаблонного нетипового параметра.
На самом деле это должно быть интуитивно приемлемо. Помните, что компилятору необходимо сгенерировать код для созданного шаблона, прежде чем программа сможет быть выполнена, и этот код должен будет использовать значение аргумента шаблона. Но значение a
не известно во время компиляции - это может быть что угодно, в зависимости от того, где будет выделена память. Очевидно, что компилятор не может предсказать, какое это будет значение.
С другой стороны, адрес глобального (или статического) объекта можно использовать в качестве аргумента шаблона указателя нетипичного типа:
int k = 10;
int main(){
f<&k>();
}
Вышеприведенный код работает, что интуитивно понятно, поскольку компилятор будет знать, где находится глобальный объект (компилятор сам поместит его туда!)
И последнее, но не менее важное: ваш заголовок не нужен. Эти правила применяются к невариантным шаблонам таким же образом.