2015-07-30 2 views
0

Я хочу использовать библиотеку заголовков GLM-матрицы для создания матрицы преобразования для моего проекта графики на C++. Чтобы проверить это, я написал следующий простой код:Ошибка «отсутствия соответствия» с вызовом функции шаблона

#include <glm/glm.hpp> 
#include <glm/gtc/matrix_transform.hpp> 

int main() 
{ 
    glm::mat4 projection_matrix = glm::perspective(45, 1.5, 0.1, 100); 
    return 0; 
} 

Однако, я получаю следующее сообщение об ошибке компиляции:

/home/Karnivaurus/Projects/GLMTest/src/main.cpp:6: error: no matching function for call to 'perspective(int, double, double, int)' 
    glm::mat4 projection_matrix = glm::perspective(45, 1.5, 0.1, 100); 
                    ^
                    ^

Далее следуют:

candidate is: 
/usr/local/include/glm/gtc/matrix_transform.inl:218: template<class T> glm::detail::tmat4x4<T, (glm::precision)0u> glm::perspective(const T&, const T&, const T&, const T&) 
    GLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> perspective 
               ^

Глядя на реализацию эта функция в предоставленном исходном коде, я могу видеть:

template <typename T> 
    GLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> perspective 
    (
     T const & fovy, 
     T const & aspect, 
     T const & zNear, 
     T const & zFar 
    ) 
    { 
    // 
    // The implementation .......... 
    // ..... 
    // ..... 
    // 
    } 

Я не особенно знаком с шаблонами на C++. Может ли кто-нибудь объяснить эту ошибку мне, пожалуйста?

ответ

2

Вы можете упростить свой пример:

template <typename T> 
void foo(const T&, const T&) 
{ } 

int main(){ 
    foo(45, 1.0); // error: no matching function for call to foo(int, double) 
} 

Это происходит потому, что, когда шаблон вычет происходит, он выводит T как int для первого аргумента и double для второго, но есть только один T, поэтому он должен быть последовательным! Никаких преобразований не произойдет для вычитания шаблона (здесь не имеет значения, что int10 и double конвертируются друг в друга), поэтому, как только мы получим несогласованные типы, вычет заканчивается неудачей - и поскольку есть только один foo, нет никакой другой перегрузки, чтобы отступить на.

Решения либо для того, чтобы типы одинаковы:

foo(45.0, 1.0); // calls foo<double> 
foo(45, 1);  // calls foo<int> 

Или явно указать, что T является:

foo<double>(45, 1.0); // calls foo<double>, explicitly 

В последнем случае, не вычет не возникает, так как мы указали T, и это эквивалентно вызванному:

void foo(const double&, const double&); 

, поэтому первый аргумент просто преобразован в double.

+0

* Как вы так быстро ?? * – Quentin

+0

@Quentin Класс ввода Я взял элементарный школа была определенно самым ценным классом моей жизни на сегодняшний день :) – Barry

+0

У меня нет никаких проблем с тобой. Вау. – Quentin

1

Шаблон функции определяется одним параметром шаблона для всех его аргументов. Вы передаете разные типы аргументов, int для первого и последнего и double для средних аргументов.

Исправление будет последовательно использовать double с для всех аргументов:

glm::mat4 projection_matrix = glm::perspective(45.0, 1.5, 0.1, 100.0); 
+0

Это сработало, спасибо. В этом случае мне действительно нужно было заставить всех их плавать, потому что я думаю, что glm :: mat4 требует данных с плавающей запятой. Итак, мое решение было следующим: 'glm :: mat4 projection_matrix = glm :: перспектива (45.0f, 1.5f, 0.1f, 100.0f);' – Karnivaurus

2

Как заявлена ​​функция, все ее параметры должны быть выведены одного типа T. В этом случае вы предоставляете два int s и два double s. Они не идентичны, поэтому инсталляция терпит неудачу.

Изменить вызов:

glm::mat4 projection_matrix = glm::perspective(45.0, 1.5, 0.1, 100.0); 

Вы также можете указать тип явно для того, чтобы преобразования:

glm::mat4 projection_matrix = glm::perspective<double>(45, 1.5, 0.1, 100); 
Смежные вопросы