私はクラスS
内からクラスの関数A<F>::f()
を呼び出すようにしようとしているが、私はS
オブジェクト(S<int>s
)をインスタンス化し、それがf
メンバ関数()だ呼び出すときに、私は次のエラーを取得しています:基本クラスの基本クラスの 'A <int>'というエラーが「S <int>」のアクセス可能なベースでないのはなぜですか?
source.cpp: In instantiation of '
int S<F>::f() [with F = int]
':
source.cpp:30:21: required from here
source.cpp:22:25: error: 'A<int>
' is not an accessible base of 'S<int>
'
これは、クラスS
の宣言の中のreturn A<F>::f();
をreturn C<A, F>::f();
に置き換えたときに機能することに注意してください。しかし、私はそれを他の方法で行うことができない理由私は思ったんだけど...
#include <iostream>
template <typename T> class A {
public:
int f();
};
template <typename T> int A<T>::f() {
return sizeof(T);
}
template <template <typename> class E, typename D> class C : E<D> {
public:
int f() {
return E<D>::f();
}
};
template <typename F> class S : C<A, F> {
public:
int f() {
return A<F>::f();
}
};
int main() {
S<int>s;
std::cout << s.f();
}
すべてのヘルプは高く評価し、更なる明確化が必要な場合は、コメントすること自由に感じなさいれます。
#include <iostream>
template <typename T> class A {
public:
int f();
};
template <typename T> int A<T>::f() {
return sizeof(T);
}
template <template <typename> class E, typename D> class C : public E<D> {
public:
int f() {
return E<D>::f();
}
};
class S : public C<A, int> {};
int main() {
S s;
std::cout << s.f(); // 4
}
最後のコメントはありません。私はすべての*クラスを公開継承で置き換えたので、今働いています。 –
別の考え方は、すべての構造体を作成して、デフォルトの公開継承を持つことができるようにすることです。 :) – 0x499602D2