GSL의 일부분에 C++ 래퍼를 작성하고 다음 퍼즐을 찾습니다. 다음과 같이 (의 필수 요소로 감소) 코드는 다음과 같습니다슈퍼 클래스 (값 전달)로 인해 오버로드 된 생성자의 모호한 호출
#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);
}
나는 당황 스럽네요
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)’
을 GCC 4.4.5 g ++ -c v.cpp 를 사용하여 컴파일하지만 양보하지 않습니다 그 protected gsl_vector_view 기본 클래스는 useVector (Vector)를 호출하여 고려됩니다. 나는 useVector가 "The C++ Programming Language", 3 번째 e. p의 말로 "일반 대중"에 속한다고 생각했을 것이다. 405에 의해 보호되고 따라서 보호 된 정보에 대한 액세스 권한이 없으므로이 정보로 혼동 될 수 없습니다. 가 나는 (중 이해가 안 정직하게, 그리고,) 내가 모르는 무엇
explicit Vector (const gsl_vector_view view);
로 생성자를 선언함으로써 모호성 제거 할 수 있다는 것을 알고 때 오버로드 된 호출의 모호성이 사라지고 있다는 것입니다
Vector (const gsl_vector_view& view);
으로 인수를 전달하십시오. (나는 어쨌든 적절한 방법을 생각합니다).
+1,'protected' 상속과는 아무런 관련이 없습니다. 그래서 질문을 다시 포맷하십시오. – iammilind
btw. useVector에서 참조를 선언 할 때 모호성이 사라집니다. – PlasmaHH