T 为 QPointF 时的模板强制转换运算符
Template cast operator when T is 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
尝试同样的事情,我会收到此错误(使用 g++ 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&&)
就像编译器甚至没有尝试使用 cast 运算符一样。 如果我更改为隐式转换,例如:
QPointF p3 = p1;
它工作正常。 如果我使用QPoint
,它也有效 - 它似乎只是QPointF
导致问题,我不知道为什么。
据
我所知,问题是QPointF
提供了一个接受QPoint
的构造函数。当您执行static_cast
时,编译器会尝试调用QPointF(MyPoint&)
,并看到两种从MyPoint
创建QPointF
的方法:
- 使用构造函数获取
QPoint
,首先将MyPoint
转换为QPoint
- 使用任何通过先将
MyPoint
转换为QPointF
来获取QPointF
的现有构造函数。
由于有多种选择,因此模棱两可。
复制初始化之所以有效p1
是因为首先将其转换为QPointF
,然后调用复制构造函数。
本文讨论QPointF p(...)
和QPointF p = ...
之间的差异。
为了说明这一点,下面是一个展示相同问题的小示例:
#include <iostream>
struct MyType
{
template < typename T >
operator T() const
{
return T{};
}
};
struct A
{
A() {}
A(const A &) {}
};
struct B
{
B() {}
B(const A &) {}
B(const B &) {}
};
int main()
{
auto my = MyType{};
auto a1 = static_cast<A>(my);
//auto b1 = static_cast<B>(my); // fails
B b2 = my;
}
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 构造函数和转换运算符之间的重载解析
- 分配给转换运算符失败-C++
- 转换运算符不适用于sleep_until
- 继承模板化转换运算符
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 如何在模板化转换运算符中消除此构造的歧义?
- 为什么选择转换运算符的重载?
- 如何避免强制转换运算符 () 和访问运算符 [] 冲突?
- 如果可能的话,C++总是更喜欢右值引用转换运算符而不是常量左值引用吗?
- 了解转换运算符的选择C++
- 多个隐式转换运算符
- 这个typedef和转换运算符语法是什么意思
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 类模板忽略了用户定义的转换运算符(非模板不忽略)
- 为什么在std::for_each()返回时调用转换运算符
- 为什么 std::optional 的强制转换运算符被忽略了
- 使用用户定义的转换运算符推导函数模板参数
- 模板转换运算符的分辨率不明确
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?