Tôi đã viết một trình bao bọc C++ nhỏ xung quanh một số phần của GSL và gặp phải câu đố sau đây (đối với tôi). Mã (giảm xuống còn yếu tố cần thiết của nó) như sau:Gọi không rõ ràng của các nhà xây dựng quá tải do lớp siêu (vượt qua giá trị)
#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);
}
sẽ không biên dịch sử dụng gcc 4.4.5 g ++ -c v.cpp nhưng mang lại
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)’
Tôi ngạc nhiên rằng bảo vệ lớp cơ sở gsl_vector_view được đưa vào xem xét bởi các cuộc gọi của useVector (Vector). Tôi đã nghĩ rằng useVector thuộc về "công chúng" trong cách nói của "Ngôn ngữ lập trình C++", thứ ba e., P. 405 và do đó không có quyền truy cập vào thông tin được bảo vệ đó, và do đó, không thể bị nhầm lẫn bởi nó. Tôi biết rằng tôi có thể thoát khỏi sự nhập nhằng bằng cách tuyên bố các nhà xây dựng như
explicit Vector (const gsl_vector_view view);
Những gì tôi không biết (và, một cách trung thực, không hiểu hoặc), đó là sự không rõ ràng của cuộc gọi quá tải sẽ biến mất khi tôi khai báo hàm tạo là
Vector (const gsl_vector_view& view);
tức là chuyển đối số theo tham chiếu (tôi vẫn xem xét cách làm đúng).
+1, Nó không liên quan gì đến việc thừa kế 'được bảo vệ'; để định dạng lại câu hỏi. – iammilind
btw. sự mơ hồ biến mất khi bạn khai báo useVector để tham chiếu – PlasmaHH