2012-09-22 9 views
15

私はクラス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 

} 

答えて

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

、デフォルトのでprivateに、基底クラスにアクセスできなくなって。

+0

最後のコメントはありません。私はすべての*クラスを公開継承で置き換えたので、今働いています。 –

+0

別の考え方は、すべての構造体を作成して、デフォルトの公開継承を持つことができるようにすることです。 :) – 0x499602D2

5

私はそれだけでpublicクラスの継承を使用しての問題だと思う:この質問以来

更新

は私が実際に働いていたコードを投稿する必要がありますね解決されます。試してみてください:あなたは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(); 
     } 
}; 
3

Aのバージョンf()を呼び出すときは、A<F>::f()という表記を使用します。 A<F>staticメンバ関数f()を持っていたら、実際にこの関数が呼び出されます。しかし、A<F>は、staticのメンバー関数f()しか持たない。すなわち、呼び出しは暗黙的にthis->A<F>::f()に変換される。しかし、S<F>はアクセシブルベースとしてA<F>を持っていません(privateベースはC<A, F>です)。

C<A, F>S<int>のづけしベースであるため、仕事をしたり、それ publicまたは protectedのいずれかにすることにより CE<D>ベースにアクセスできるようにする必要があり
C<A, F>::f(); 

:その様子からは、f()C<A, F>のバージョンに委譲したいです。

+0

これが本当であることがわかりません。この場合、 'A 'はその型のプライベートベースです。 Lookupは、名前空間のレベルをチェックする前に、注入された型名を見つけます。したがって、 'A'のメンバメソッドが静的であるかどうかは重要ではありません。 –

関連する問題