为什么我得到错误'A <int>'对于基类的基类来说不是'S <int>'的可访问基础?

tem*_*boy 17 c++ templates c++11

我试图A<F>::f()从类中调用类函数S,但是当我实例化一个Sobject(S<int>s)并调用它的f成员函数(s.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();

}
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏,如果您需要进一步说明,请随时发表评论.

更新

由于这个问题已经解决,我想我应该发布实际工作的代码:

#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

}
Run Code Online (Sandbox Code Playgroud)

Bo *_*son 33

template <typename F> class S : C<A, F> 
                               ^
Run Code Online (Sandbox Code Playgroud)

您没有指定public继承,因此它默认为private,使基类不可访问.


Mas*_*ano 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();
      }
};
Run Code Online (Sandbox Code Playgroud)