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 を使用してコンパイルしますが得られませんことベースクラスgsl_vector_viewは、useVector(Vector)の呼び出しによって考慮されます。私はuseVectorが "The C++ Programming Language"、第3章、p。その保護された情報にアクセスすることができず、したがって、それによって混乱することはありません。 私は知りませんでした何を(正直に、そして、どちらか理解していない)私は
explicit Vector (const gsl_vector_view view);
としてコンストラクタを宣言することにより、あいまいさを取り除くことができることを知って、ときに私オーバーロードされたコールのあいまいさがなくなるということです
Vector (const gsl_vector_view& view);
というように、コンストラクタを宣言します。つまり、私は何となく適切なやり方だと考えています。
+1、これは 'protected'継承とは関係ありません。そのように質問を再フォーマットする。 – iammilind
btw。参照を取るためにuseVectorを宣言するとあいまいさがなくなります – PlasmaHH