Согласно стандарту, вам не повезло. Невозможно инициализировать аргумент указателя на что-либо, кроме адреса глобальной переменной. §14.3.2 / 1:
Шаблон-аргумент для не-типа,
шаблонный параметр-шаблон должен
быть одним из:
- целочисленная константа-выражение целого или перечислимого типа; или
- имя нетипового шаблона-параметра; или
- адрес объекта или функции с внешней связью, в том числе
шаблоны функций и функции
идентификаторы шаблона, но исключая нестатические
ученики, выраженные как &
id-выражение, где & является необязательным
если имя относится к функции или
массив, или если соответствующий
параметр-шаблона является ссылкой; или
- указатель на член, выраженный как описано в 5.3.1.
§14.3.2 / 5:
- для нетипового шаблона-параметра
указатель типа на объект, квалификация
преобразования (4.4) и
преобразование массива в указатель (4.2)
применяется. [Примечание: в частности, ни
преобразование нулевого указателя (4.10) ни
преобразование производного в основание (4.10)
применяются. Хотя 0 является действительным
шаблон-аргумент для нетипичного
шаблон-параметр целочисленного типа,
это не правильный шаблон-аргумент
для нетипового шаблона-параметра
тип указателя ]
Однако Comeau принимает этот недействительный обходной путь:
typedef Tem<FILE*, (FILE *) NULL > TemFile;
И у этого кода есть небольшая вероятность соответствия: я не могу найти, где стандарт конкретно говорит, что выражение по умолчанию используется дословно вместо отсутствующего аргумента, и я не могу найти соответствующий известный дефект. У кого-нибудь есть ссылка?
#include <stdio.h>
template <typename T, T *v = (T*) 0> class Tem
{
T t;
Tem()
{
t = v;
}
};
typedef Tem<FILE> TemFile;
Для большей переносимости, вы можете рассмотреть возможность создания фиктивного FILE FILE_NULL;
, передачи &FILE_NULL
и проверки на равенство указателей с этим вместо нуля.