使用sf::Vector2<double>编译失败,替换为sf::Vector2f可正常运行
为什么SFML中sf::Vertex不能接受sf::Vector2作为构造参数?
这个问题其实很好理解——SFML的sf::Vertex类从设计上就只支持基于float的向量类型,完全不兼容double版本的sf::Vector2。
具体原因
SFML的图形模块底层依赖OpenGL,而OpenGL在处理顶点数据时默认使用单精度浮点数(float)来平衡性能和精度需求。因此sf::Vertex的构造函数只提供了接受sf::Vector2f(也就是sf::Vector2<float>)的重载,根本没有为sf::Vector2<double>编写对应的构造逻辑。这就是编译器抛出no matching function for call to ‘sf::Vertex::Vertex(sf::Vector2<double>)’错误的核心原因。
至于你尝试的typedef,它只是给sf::Vector2<double>起了个新名字,并没有改变它的本质类型——SFML的构造函数依然认不出这个类型,自然不会起作用。
解决办法
这里有两种可行的处理方式:
- 推荐:直接使用
sf::Vector2f
这是最贴合SFML设计思路的方案,就像你已经尝试的那样,把sf::Vector2<double>替换成sf::Vector2f即可。修改后的代码片段如下:sf::Vertex line[] = { sf::Vertex(sf::Vector2f(10.0f, 10.0f)), sf::Vertex(sf::Vector2f(150.0f, 150.0f)) }; - 如果必须用double:显式类型转换
要是你因为业务逻辑必须保留double类型的数值,可以通过显式转换将其转为float后再构造sf::Vector2f:double x1 = 10.0, y1 = 10.0; double x2 = 150.0, y2 = 150.0; sf::Vertex line[] = { sf::Vertex(sf::Vector2f(static_cast<float>(x1), static_cast<float>(y1))), sf::Vertex(sf::Vector2f(static_cast<float>(x2), static_cast<float>(y2))) };
另外提一句:SFML里大部分图形相关的API(比如精灵位置、视图尺寸等)都使用float类型的向量,保持类型一致能帮你避免不少潜在的类型错误哦。
内容的提问来源于stack exchange,提问作者Mangodile
相关产品推荐
相关产品推荐

