我的载体声明如下:
std::vector<double> vec1;
std::vector<double> vec2;
double result = glm::dot(vec1, vec2);
我收到以下错误:error: no viable conversion from 'std::__1::vector<double, std::__1::allocator<double> >' to 'double'
在这种情况下,glm::dot
不应该返回标量值(double
)吗?
答案 0 :(得分:5)
我可能会误认为自己,但这个错误必须来自参数类型,而不是返回类型,glm :: dot从未将任何std :: vector作为参数,因为它不是vec2或vec3等(不是glm类型),它可能会尝试将其强制转换为1维值来执行1维标量乘积
答案 1 :(得分:1)
正如Guiroux所说,第一个问题是你使用的是std :: vector而不是glm vector(比如vec3)。另一方面,在更改之后,您将在vec3和float
之间获得无效转换你可以试试这个:
glm::vec3 a;
glm::vec3 b;
glm::dot<3, float, glm::qualifier::highp>(a, b);
由于GLM有两种方法点
template<typename T>
GLM_FUNC_QUALIFIER T dot(T x, T y)
{
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs");
return x * y;
}
template<length_t L, typename T, qualifier Q>
GLM_FUNC_QUALIFIER T dot(vec<L, T, Q> const& x, vec<L, T, Q> const& y)
{
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs");
return detail::compute_dot<vec<L, T, Q>, T, detail::is_aligned<Q>::value>::call(x, y);
}
编译器假设T是vec3,因此使用第一种方法
看一下这篇文章:
在通用类型T用作参数的特定情况下 对于GetMax,编译器可以自动找出哪种数据类型 实例化而不必在角度内明确指定它 括号(就像我们在指定之前所做的那样)。所以我们 本来可以写:int i,j; GetMax(i,j);
答案 2 :(得分:0)
只是重复上述内容,试试这个:
glm::dvec3 vec1;
glm::dvec3 vec2;
double result = glm::dot(vec1, vec2);