簡體   English   中英

模板子類中的C ++名稱解析

[英]C++ Name Resolution in Template Subclass-of-Subclass

我試圖在C ++代碼中訪問基類數據,而不使用“ this”指針。 我的類是模板化的, ClassAClassB的基類, ClassBClassC的基類。 所有類均公開自其基類。 我發現此討論使我進入了解決方案的半途,但並未完全解決它:

為什么我必須通過this指針訪問模板基類成員?

該頁面建議我應該能夠使用“使用”語句解決我的問題。 這是我要執行的操作的一個示例:

#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 ClassC ,但不能同時使用。 如果我在兩個類中都使用using語句,則會收到上面顯示的錯誤。 所有繼承都是通過公共派生完成的。

有人知道解決方案嗎? (除了使用“ this”或完全限定的作用域名稱訪問我的數據元素外?)

您的問題是在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 ;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM