glm :: dot返回一个向量

时间:2016-02-25 13:28:37

标签: c++ vector glm-math

我的载体声明如下:

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)吗?

3 个答案:

答案 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,因此使用第一种方法

看一下这篇文章:

Templates C++

  

在通用类型T用作参数的特定情况下   对于GetMax,编译器可以自动找出哪种数据类型   实例化而不必在角度内明确指定它   括号(就像我们在指定之前所做的那样)。所以我们   本来可以写:int i,j; GetMax(i,j);

答案 2 :(得分:0)

只是重复上述内容,试试这个:

glm::dvec3 vec1;
glm::dvec3 vec2;
double result = glm::dot(vec1, vec2);