Как предоставить правильные параметры без "&" или "*" вызываемому методу?
Я новичок здесь, совершенно новый для написания кода в С++ и в настоящее время сталкивается с следующей проблемой:
Я использую библиотеку wykobi, которая занимается геометрией и решает многие из моих предыдущих проблем, но теперь я хочу создать треугольник, используя ее, и не могу понять, как правильно вызвать нужный метод.
std::string x_str(argv[2]);
std::string y_str(argv[3]);
double x = atof(x_str.c_str());
double y = atof(y_str.c_str());
[...]
double x2;
x2 = double(orientation.direction.x)+angleRightx;
double y2;
y2 = double(orientation.direction.y)+angleRighty;
double x3;
x3 = double(orientation.direction.x)+angleLeftx;
double y3;
y3 = double(orientation.direction.y)+angleLefty;
wykobi::triangle<wykobi::Float,2> clip_boundry = wykobi::make_triangle<wykobi::Float,2>(&x,&y, &x2,&y2, &x3,&y3);
wykobi::polygon<wykobi::Float,2> clipped_polygon;
wykobi::algorithm::sutherland_hodgman_polygon_clipper<wykobi::point2d<wykobi::Float> >(clip_boundry,wykPG,clipped_polygon);
Я попробовал нечто подобное перед созданием круга, который работал отлично:
wykobi::circle<wykobi::Float> circle;
circle.x = x;
circle.y = y;
circle.radius = dist;
wykobi::polygon<wykobi::Float,2> clip_boundry = wykobi::make_polygon<wykobi::Float>(circle,100);
wykobi::polygon<wykobi::Float,2> clipped_polygon;
wykobi::algorithm::sutherland_hodgman_polygon_clipper<wykobi::point2d<wykobi::Float> >(clip_boundry,wykPG,clipped_polygon);
Теперь проблема компиляции:
error: нет соответствующей функции для вызова 'make_triangle (double *, double *, double *, double *, double *, double *)'
Когда я удаляю амперсанды:
wykobi::triangle<wykobi::Float,2> clip_boundry = wykobi::make_triangle<wykobi::Float,2>(x,y, x2,y2, x3,y3);
Ошибка при компиляции:
ошибка: нет соответствующей функции для вызова 'make_triangle (double &, double &, double &, double &, double &, double &)'
И, наконец, метод, который я вызываю, выглядит так:
template<typename T> inline triangle<T,2> make_triangle(const T& x1, const T& y1, const T& x2, const T& y2, const T& x3, const T& y3);
Итак, интересно, что мне нужно изменить, чтобы указать правильные параметры?
Спасибо заранее!
Ответы
Ответ 1
У вас есть как минимум следующие проблемы:
1) Смешивание с помощью wykobi:: Float.
2) Вы передаете два параметра шаблона, тогда как функция ожидает только один.
3) Выделение шаблона можно было бы здесь сделать.
Попробуйте этот код:
wykobi::make_triangle(x, y, x2, y2, x3, y3);
или
wykobi::make_triangle<wykobi::Float>(x, y, x2, y2, x3, y3);
или
wykobi::make_triangle<double>(x, y, x2, y2, x3, y3);
но убедитесь, что эти параметры wykobi:: Float или double соответственно. Не смешивайте их, если wykobi:: Float - это своего рода typedef.
Кроме того, не пытайтесь передавать адреса, потому что эта функция шаблона не ожидает указателя.
Ответ 2
Функция make_triangle<wykobi::Float..()
требует, чтобы вы передавали ссылки на wykobi::Float
, но вместо этого вы пытаетесь передать переменные типа double
.
Я не знаю библиотеку, но вижу, есть ли явное или неявное преобразование из double
в тип wykobi::Float
например.
wykobi::Float wx1 = x;
или
wykobi::Float wx1 = new wykobi::Float(x);
а затем передайте их функции make_triangle
.
Кроме того, согласно комментарию Lazlo, константа 2
не представляется допустимой для параметра шаблона - это должно быть type
, например. внутр.
Ответ 3
Глядя на wykobi headers, похоже, что wykobi::Float
является typedef для float
или double
, в зависимости от компилятора опции. И из ваших ошибок, я бы сказал, что это float
.
Итак, ваше решение должно быть последовательным и использовать wykobi::Float
вместо double
всюду и/или компилировать библиотеку с помощью define WYKOBI_DOUBLE_PRECISION
.
Другой вариант - вызвать функцию без указания параметров шаблона, так как компилятор автоматически выведет их. Но тогда, если вы несовместимы, вы получите странные ошибки при смешивании double
и float
.
wykobi::triangle<double,2> clip_boundry =
wykobi::make_triangle(x,y, x2,y2, x3,y3);
который будет выводиться так:
wykobi::triangle<double,2> clip_boundry =
wykobi::make_triangle<double>(x,y, x2,y2, x3,y3);
Обратите внимание, что 2
не является аргументом шаблона для функции.