मैंने जीएसएल के कुछ हिस्सों के आसपास थोड़ा सी ++ रैपर लिखा और निम्नलिखित पहेली (मेरे लिए) का सामना किया। कोड (अपने अनिवार्य करने के लिए कम) इस प्रकार है:सुपर क्लास (मूल्य से गुजरने) के कारण ओवरलोडेड कन्स्ट्रक्टर की संदिग्ध कॉल
#include <stdlib.h>
struct gsl_vector_view {};
class Vector : protected gsl_vector_view {
public:
Vector (const Vector& original);
Vector (const gsl_vector_view view);
};
class AutoVector : public Vector {
public:
explicit AutoVector (const size_t dims);
};
void useVector (const Vector b) {}
void test() {
const AutoVector ov(2);
useVector(ov);
}
जीसीसी 4.4.5 जी ++ -c v.cpp का उपयोग कर संकलन नहीं होगा लेकिन उपज
In function ‘void test()’:
19: error: call of overloaded ‘Vector(const AutoVector&)’ is ambiguous
7: note: candidates are: Vector::Vector(gsl_vector_view)
6: note: Vector::Vector(const Vector&)
19: error: initializing argument 1 of ‘void useVector(Vector)’
मैं हैरान हूं कि संरक्षित आधार वर्ग gsl_vector_view उपयोग वेक्टर (वेक्टर) के कॉल द्वारा विचार में लिया जाता है। मैंने सोचा होगा कि उपयोग वेक्टर "द सी ++ प्रोग्रामिंग लैंग्वेज", तीसरी ई।, पी के अनुपालन में "आम जनता" से संबंधित है। 405 और इस प्रकार उस संरक्षित जानकारी तक पहुंच नहीं है और इसलिए, इससे भ्रमित नहीं किया जा सकता है। मुझे पता है कि मैं
explicit Vector (const gsl_vector_view view);
क्या मुझे नहीं पता था के रूप में निर्माता की घोषणा (ईमानदारी से और, या तो समझ में नहीं आता) द्वारा अस्पष्टता से छुटकारा मिल सकता है, कि अतिभारित कॉल की अस्पष्टता गायब हो जाता है जब मैं है
Vector (const gsl_vector_view& view);
यानी संदर्भ द्वारा तर्क (जिसे मैं चीजों को करने का उचित तरीका मानता हूं) के रूप में घोषित करता हूं।
+1, इसका 'संरक्षित' विरासत से कोई लेना देना नहीं है; तो सवाल को दोबारा सुधारना। – iammilind
बीटीडब्ल्यू। अस्पष्टता गायब हो जाती है जब आप संदर्भ लेने के लिए वेक्टर को भी घोषित करते हैं – PlasmaHH