Как предоставить правильные параметры без "&" или "*" вызываемому методу?

Я новичок здесь, совершенно новый для написания кода в С++ и в настоящее время сталкивается с следующей проблемой:

Я использую библиотеку 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 не является аргументом шаблона для функции.