У меня есть пользовательский двумерную тип точки, которая имеет оператор шаблона произнесения:шаблона оператор приведения, когда Т QPointF
struct MyPoint
{
double x, y;
template < typename T >
operator T() const
{
return T{ x, y };
}
};
Все отлично работает для std
типов:
auto p1 = MyPoint{ 1, 2 };
auto p2 = static_cast< std::array< double, 2 > >(p1);
auto p3 = static_cast< std::pair< double, double > >(p1);
Но если я попробовать то же самое с QPointF
, я получаю эту ошибку (используя г ++ v4.8):
../CppTest/main.cpp:23:42: error: call of overloaded 'QPointF(MyPoint&)' is ambiguous
auto p3 = static_cast<QPointF>(p1);
^
../CppTest/main.cpp:23:42: note: candidates are:
In file included from /usr/include/qt5/QtCore/QPointF:1:0,
from ../CppTest/main.cpp:2:
/usr/include/qt5/QtCore/qpoint.h:270:18: note: constexpr QPointF::QPointF(const QPoint&)
Q_DECL_CONSTEXPR inline QPointF::QPointF(const QPoint &p) : xp(p.x()), yp(p.y()) { }
^
/usr/include/qt5/QtCore/qpoint.h:205:46: note: constexpr QPointF::QPointF(const QPointF&)
class Q_CORE_EXPORT QPointF
^
/usr/include/qt5/QtCore/qpoint.h:205:46: note: constexpr QPointF::QPointF(QPointF&&)
Это похоже на то, что компилятор даже не пытается использовать оператор трансляции. Если я перейду на неявное преобразование, например:
QPointF p3 = p1;
Это нормально работает. Он также работает, если я использую QPoint
- он просто кажется QPointF
, что вызывает проблемы, и я понятия не имею, почему.
Отличный ответ! – cmannett85