20

我试图A<F>::f()从类中调用类函数S,但是当我实例化一个S对象(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();

}

任何帮助表示赞赏,如果您需要进一步澄清,请随时发表评论。

更新

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

#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>有一个static成员函数f(),这个函数确实会被调用。但是,A<F>只有一个非static成员函数f(),即调用被隐式转换为this->A<F>::f()。但是,S<F>没有 aA<F>作为可访问的基础(它是 的private基础C<A, F>)。从它的外观你想委托给C<A, F>s 版本f()

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

这应该可以工作,因为C<A, F>它是可访问的基础,或者通过将其设为orS<int>来使E<D>基础C可访问。publicprotected

于 2012-09-22T20:17:25.697 回答