मैं एक फ़ंक्शन रैपर बनाने की कोशिश कर रहा हूं जो 1 टेम्पलेट तर्क के साथ एक फ़ंक्शन लेता है और इसे किसी अन्य शीर्षलेख फ़ाइल में उपयोग करता है। मूल रूप से मुख्य कार्यक्रम कुछ चरों की गणना करता है जो my_function को परिभाषित करता है, जिसका उपयोग सीजीएएल में "मानदंड। एच" शीर्षलेख को परिभाषित करने के लिए किया जाता है। यहाँ "sizing_fun.h" है जिसमें फंक्शन और फंक्शन रैपर शामिल हैं:

template <typename Point_vec>
double my_function(double x, double y, Point_vec list_of_points)
{
  //use list_of_points
  return 4.0+(x*x+y*y);
}

template <typename FT, typename Point_2, typename Point_vec>
class FT_to_point_function_wrapper : public std::binary_function<Point_2, Point_vec, FT>
{
  typedef FT (*Implicit_function)(FT, FT, FT);
  Implicit_function function;
 public:
  FT_to_point_function_wrapper(Implicit_function f) : function(f) {}
  FT operator()(Point_2 p, Point_vec list) const { return function(p.x(), p.y(), std::forward<Point_vec>(list)); } //error line
};

"मानदंड.एच" में, मैं my_func को ऊपर परिभाषित फ़ंक्शन रैपर के रूप में उपयोग करता हूं। pcc पॉइंट_2 तर्क है, और my_list Point_vec तर्क है।

double local_squared_size_bound = my_func(pcc,my_list);

मैं त्रुटि संदेश जाता हूं:

sizing_fun.h:17: error: cannot convert 'std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >' to 'double' in argument passing

तो ऐसा लगता है कि Point_vec प्रकार सही ढंग से पारित नहीं हुआ है।

मुझे इस पोस्ट का एहसास हुआ: C++ फंक्शन कॉल रैपर फंक्शन के साथ टेम्प्लेट आर्गुमेंट लेकिन मुझे लगता है कि यह अलग है क्योंकि इसके कार्यों में टेम्पलेट तर्क नहीं है।

2
enni707 27 फरवरी 2019, 09:11

1 उत्तर

सबसे बढ़िया उत्तर

typedef FT (*Implicit_function)(FT, FT, FT);

आपने घोषित किया कि फ़ंक्शन सभी 3 मापदंडों के लिए एक ही प्रकार को स्वीकार करता है, और उसी प्रकार को भी लौटाता है।

typedef FT (*Implicit_function)(FT, FT, Point_vec); होना चाहिए था

Implicit_function के सिग्नेचर को ठीक करें, और आपकी समस्या दूर हो जाएगी।

यदि यह कम से कम C++11 है, तो आपको कच्चे फ़ंक्शन पॉइंटर पर std::function को भी प्राथमिकता देनी चाहिए ताकि बाइंडिंग/कैप्चर वाले फ़ंक्शंस या लैम्ब्डा स्वीकार किए जा सकें।

FT_to_point_function_wrapper::function को const घोषित किया जाना चाहिए क्योंकि यह केवल कंस्ट्रक्टर में इनिशियलाइज़र सूची द्वारा निर्धारित किया जाता है। यदि C++11 का उपयोग कर रहे हैं, तो आप FT_to_point_function_wrapper::FT_to_point_function_wrapper को constexpr घोषित भी कर सकते हैं।

FT_to_point_function_wrapper::operator() को const भी घोषित किया जाना चाहिए।

4
Ext3h 27 फरवरी 2019, 06:46