20

A<F>::f()クラス内からクラス関数を呼び出そうとしていますが、オブジェクト( )をインスタンス化してそのメンバー関数()を呼び出すとS、次のエラーが発生します。SS<int>sfs.f()

source.cpp:''のインスタンス化int S<F>::f() [with F = int]
source.cpp:30:21:ここから必要です
source.cpp:22:25:エラー:' 'は' 'A<int>のアクセス可能なベースではありませんS<int>

return A<F>::f();これは、クラスの宣言内Sを。に置き換えると機能することに注意してください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

}
4

3 に答える 3

36
template <typename F> class S : C<A, F> 
                               ^

public継承を指定しないため、デフォルトでprivateになり、基本クラスにアクセスできなくなります。

于 2012-09-22T20:17:01.837 に答える
5

publicクラス継承を使うだけの問題だと思います。試してみてください:

template <template<class> class E, typename D> class C : public E<D> {
   public:
      int f() {
         return E<D>::f();
      }
};

template <typename F> class S : public C<A, F> {
   public:
      int f() {
         return A<F>::f();
      }
};
于 2012-09-22T20:15:34.270 に答える
3

Aのバージョンを呼び出そうとしているときはf()、表記を使用しますA<F>::f()。メンバー関数A<F>がある場合、この関数は実際に呼び出されます。ただし、非メンバー関数のみがあります。つまり、呼び出しは暗黙的にに変換されます。ただし、アクセス可能なベースとしてはありません(のベースです)。その外観から、次のバージョンに委任します。staticf()A<F>staticf()this->A<F>::f()S<F>A<F>privateC<A, F>C<A, F>f()

C<A, F>::f();

これはC<A, F>、のアクセス可能なベースであるS<int>ため、またはのいずれかを作成することによってのベースE<D>Cアクセス可能にするために機能するはずです。publicprotected

于 2012-09-22T20:17:25.697 に答える