Как правило, использование разных типов для каждого значения, которое вы хотите использовать, не так уж полезно.В большинстве случаев я ожидаю, что вы захотите использовать T()
в качестве значения по умолчанию по умолчанию (нет, дубликат «default» не является типом) с возможностью переопределения значения по умолчанию объекта, используя параметр конструктора.Использование аргумента шаблона для значения по умолчанию не работает, если вы хотите определить значение во время выполнения.
Фактически код в вопросе показывает, почему использование значения по умолчанию в качестве аргумента шаблона проблематично: выможно использовать только константные выражения в качестве аргументов.То есть только аргументы, которые компилятор может выяснить во время компиляции, являются жизнеспособными.Более того, они также должны быть четко помечены как постоянные:
int const defValue = 0;
Чтобы иметь дело с нецелыми типами, вы можете рассмотреть возможность использования указателя или ссылки на объект в области пространства имен.Тем не менее, я думаю, что использование параметра конструктора - это то, что действительно нужно здесь.