glm::dot() не возвращает значение типа float/double?

Я пытаюсь использовать glm::dot рассчитать скалярное произведение двух glm::dvec3

Тем не менее, мой компилятор возвращает эту ошибку, когда я пытаюсь сделать это

#include <glm/glm.hpp>

int main(int argc, char* argv[]){
    glm::dvec3 a = glm::dvec3(1f, 2f, 3f);
    glm::dvec3 b = glm::dvec3(4f, 5f, 6f);
    float weight = glm::dot(a, b)
}

ОШИБКА: Type 'double' and 'glm::dvec3' are not compatible в последней строке, когда я присваиваю вес результату glm:: dot

Я использую (clion, cygwin, gcc) и glm 0.9.8 и C++ 11

РЕДАКТИРОВАТЬ: добавить более подробное местоположение ошибки и контекст кода

1 ответ

Может быть, есть лучшее решение, но это работает для меня

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);

Надеюсь это поможет

Другие вопросы по тегам