[英]C++ Name Resolution in Template Subclass-of-Subclass
我試圖在C ++代碼中訪問基類數據,而不使用“ this”指針。 我的類是模板化的, ClassA
是ClassB
的基類, ClassB
是ClassC
的基類。 所有類均公開自其基類。 我發現此討論使我進入了解決方案的半途,但並未完全解決它:
該頁面建議我應該能夠使用“使用”語句解決我的問題。 這是我要執行的操作的一個示例:
#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”或完全限定的作用域名稱訪問我的數據元素外?)
您的問題是在ClassB
中using 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.