Специализация шаблона с типом возвращаемого значения, полученным из decltype в Visual Studio - PullRequest
3 голосов
/ 01 мая 2019

С учетом следующего кода:

template<typename ValueType>
decltype(ValueType{} == ValueType{}) Compare(const ValueType& value, const ValueType& expected)
{
    return value == expected;
}

template<>
decltype(float{} == float{}) Compare<float>(const float& value, const float& expected)
{
    return std::abs(value - expected) < 1e-4F;
}

Я бы ожидал, что вызов Compare(13.0F, 42.0F) правильно вызовет специализацию , которую он выполняет для gcc . Но это не на . Я получаю ошибку:

ошибка C2912: явная специализация bool Compare<float>(const float &,const float &) не является специализацией шаблона функции

Могу ли я чем-нибудь помочь, чтобы помочь ?

1 Ответ

4 голосов
/ 01 мая 2019

Чтобы успокоить VC ++, вы можете извлечь возвращаемый тип в качестве другого аргумента шаблона.

template<typename ValueType, typename RetType = decltype(ValueType{} == ValueType{})>
RetType Compare(const ValueType& value, const ValueType& expected)
{
    return value == expected;
}

template<>
decltype(float{} == float{}) Compare<float>(const float& value, const float& expected)
{
    return std::abs(value - expected) < 1e-4F;
}

Это заставляет VC ++ принимать код.

...