2017-03-16 23 views
0

"this"ポインタを使用せずにC++コードのベースクラスデータにアクセスしようとしています。私のクラスはテンプレート化されており、ClassAClassBの基本クラスであり、ClassCの基本クラスです。すべてのクラスは、その基底クラスから公開されます。ページは、私が文を「使用」と私の問題を解決することができるはず示唆テンプレート内のC++の名前解決サブクラスサブクラス

Why do I have to access template base class members through the this pointer?

を:私は途中ソリューションに私を取得し、この議論を見つけましたが、それを完全に解決しません。ここで私が何をしようとしています何の例です:

#include <iostream> 

template <typename FP> 
class ClassA 
{ 
    protected: 
    FP a ; 
} ; 

template <typename FP> 
class ClassB : public ClassA <FP> 
{ 
    using ClassA <FP> :: a ; 
    public: 
    void fooB (void) { std:: cout << a << std::endl ; } 
} ; 

template <typename FP> 
class ClassC : public ClassB <FP> 
{ 
    using ClassA <FP> :: a ; 
    public: 
    void fooC (void) { std:: cout << a << std::endl ; } 
} ; 

int main (int argc, char *argv[]) 
{ 
    ClassB <double> tempB ; 
    ClassC <double> tempC ; 

    tempB.fooB () ; 
    tempC.fooC () ; 

    return 0 ; 
} 

上記のコードはコンパイルに失敗し、下のエラーを与える:私は何を見つけたことは「使用」は作ることです

stepTWO.cpp: In instantiation of ‘class ClassC<double>’: 
stepTWO.cpp:30:25: required from here 
stepTWO.cpp:8:12: error: ‘double ClassA<double>::a’ is protected 
     FP a ; 
      ^
stepTWO.cpp:20:11: error: within this context 
    class ClassC : public ClassB <FP> 

変数はでアクセス可能です。ClassBまたは のいずれかでアクセス可能ですが、両方ではありません。両方のクラスにusingステートメントを置くと、上記のエラーが発生します。すべての継承はパブリック派生によって行われます。

誰もがこの作業を行うための解決策を知っていますか? (「この」または完全修飾スコープ名を使用してデータ要素にアクセスする以外)

+1

'ClassB'でシンボル' protected'を作ろうとしましたか? –

+0

@Someprogrammerdude - ありがとう!これらの提案が出るまで、私はそのようなことが「使用する」という点で重要であることを認識していませんでした。とても有難い! –

答えて

2

ClassBusing ClassA <FP> :: a ;はクラスのプライベートセクションにあります。つまり、派生クラスはアクセスできなくなります。あなたがする必要があるのは、変数がClassAと宣言されているように、保護されたセクションに配置することです。あなたはそれを得ること:

#include <iostream> 

template <typename FP> 
class ClassA 
{ 
    protected: 
    FP a ; 
} ; 

template <typename FP> 
class ClassB : public ClassA <FP> 
{ 
    protected: 
    using ClassA <FP> :: a ; // protected so it can be inherited 
    public: 
    void fooB (void) { std:: cout << a << std::endl ; } 
} ; 

template <typename FP> 
class ClassC : public ClassB <FP> 
{ 
    using ClassA <FP> :: a ; 
    public: 
    void fooC (void) { std:: cout << a << std::endl ; } 
} ; 

int main (int argc, char *argv[]) 
{ 
    ClassB <double> tempB ; 
    ClassC <double> tempC ; 

    tempB.fooB () ; 
    tempC.fooC () ; 

    return 0 ; 
} 
+0

ありがとうございました!!!そこに目を向けるために私に起きたことさえなかった。解決済み! –

+0

@PatrickKelly問題ありません。喜んで助けてください。 – NathanOliver

関連する問題