C ++ Win32 Console Color

Стандарт говорит в [temp.res] / 8

Диагностика не должна выдаваться для определения шаблона, для которого может быть создана действительная специализация. Если для определения шаблона не может быть создана действительная специализация, и этот шаблон не создается, определение шаблона плохо сформировано, не требуется диагностика. ... [Примечание: Если экземпляр шаблона создается, ошибки будут диагностированы в соответствии с другими правилами настоящего стандарта. Точно, когда эти ошибки диагностируются, это проблема качества реализации. - примечание к концу]

Невозможно создать экземпляр шаблона функции, который будет компилироваться, поэтому определение шаблона плохо сформировано и поэтому разрешен компилятор (но не обязательно), чтобы отклонить его, даже если он не создан.

Вы можете заставить его работать следующим образом:

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> будет создана и статическое утверждение будет по-прежнему терпеть неудачу.

13
задан J. Calleja 16 June 2017 в 16:37
поделиться