Стандарт говорит в [temp.res] / 8
Диагностика не должна выдаваться для определения шаблона, для которого может быть создана действительная специализация. Если для определения шаблона не может быть создана действительная специализация, и этот шаблон не создается, определение шаблона плохо сформировано, не требуется диагностика. ... [Примечание: Если экземпляр шаблона создается, ошибки будут диагностированы в соответствии с другими правилами настоящего стандарта. Точно, когда эти ошибки диагностируются, это проблема качества реализации. - примечание к концу]
blockquote>Невозможно создать экземпляр шаблона функции, который будет компилироваться, поэтому определение шаблона плохо сформировано и поэтому разрешен компилятор (но не обязательно), чтобы отклонить его, даже если он не создан.
Вы можете заставить его работать следующим образом:
template<typename T> struct foobar : std::false_type { }; template <typename T> inline T getValue(AnObject&) { static_assert( foobar<T>::value , "this function has to be implemented for desired type"); }
Теперь компилятор не может сразу отказаться от шаблона функции , поскольку до момента его создания он не знает, будет ли специализация
foobar
, которая имеетvalue == true
. При создании экземпляра соответствующая специализацияfoobar<T>
будет создана и статическое утверждение будет по-прежнему терпеть неудачу.