Я пишу класс на C ++ 17, в котором я хотел бы использовать оператор преобразования перегрузки для плавающих типов, а также для некоторых пользовательских типов.Вот воспроизводимый пример.Есть еще много преобразований, которые мне нужно добавить с помощью шаблонов, но если я смогу их разрешить, остальные должны быть похожими.
class A {
};
class B : public A {
};
class C: public A {
};
class Missing {
public:
Missing() {}
Missing(Missing &) = default;
template<typename T,typename=typename std::enable_if_t<std::is_floating_point_v<T>, T>>
explicit constexpr operator T() const {
return static_cast<T>(NAN);
}
template<typename T, class = typename std::enable_if_t<std::is_base_of_v<A, T>, T>>
explicit operator T() const {
return T();
}
};
Однако при компиляции с gcc 8.2 с флагом std = c ++ 17,Я получаю следующую ошибку:
<source>:25:12: error: 'template<class T, class> Missing::operator T() const' cannot be overloaded with 'template<class T, class> constexpr Missing::operator T() const'
explicit operator T() const {
^~~~~~~~
<source>:20:22: note: previous declaration 'template<class T, class> constexpr Missing::operator T() const'
explicit constexpr operator T() const {
^~~~~~~~
Compiler returned: 1
Я думаю, что использование enable_if
предотвратит перегрузку операторов для одного и того же типа, но похоже, что компилятор не смотрит на enable_if
напервый проход.Я не уверен, что у меня правильный синтаксис.Любая помощь будет оценена.Занимался этим уже некоторое время.
Обновление :
Попытка обновления операторов до
template<typename T>
constexpr explicit operator std::enable_if_t<std::is_floating_point_v<T>, T>() const {
return static_cast<T>(NAN);
}
template<typename T>
explicit operator std::enable_if_t<std::is_base_of_v<A, T>, T>() const {
return T();
}
Но сейчас, при попыткеЧтобы бросить класс для плавания:
int main() {
Missing m;
float a = static_cast<float>(m);
}
Я получаю ошибку:
<source>:34:35: error: invalid static_cast from type 'Missing' to type 'float'
float a = static_cast<float>(m);