2011-08-26 89 views
16

我遇到類似於以下鏈接中描述的問題,其中當我嘗試聲明時,私有繼承基類給出「在此上下文中不可訪問」錯誤派生類中的基類中的一員: http://bytes.com/topic/c/answers/164246-private-inheritance-renders-class-inaccessible私有繼承隱藏基類「在此上下文中無法訪問」錯誤

與:: X顯式引用X工作在上述情況下,但如果代碼是在一個函數,如:

void fooby() 
{ 
    class X {}; 

    class Y : private X {}; 

    class Z : public Y 
    { 
    public: 
     X x; // compiler "inaccessible within this context" error 
    }; 
}; 

如何在這種情況下你會引用X嗎?

如果fooby是一個struct/class,那麼:: fooby :: X會工作,但我不知道如何在上面的情況下做到這一點。

+0

你想要做什麼同時擁有同一類型的成員和基類?也許這將有助於替代建議。 –

+0

@Mark B - 這僅僅是一個簡單的人爲的例子來說明我試圖理解的行爲 –

回答

10

,你所面臨的問題是,有注入標識符XY(和所有派生類型)是指X,這是不下面Y.

了要在命名空間級別聲明的用戶定義類型的常見的情況訪問,你可以使用命名空間限定的類型和訪問:因爲你AR

class X {}; 
class Y : X {}; 
class Z : Y { 
    ::X x;   // or Namespace::X 
}; 

e在一個不是有效選項的函數中定義你的類型。

或者,您可以解決與其他解決方法的問題。作爲@Eugene建議,你可以創建一個替代標識符指X

typedef class X {} another_name; 
class Y : X {}; 
class Z : Y { 
    another_name x; 
}; 

或者你可以添加一個typedefY提供類型派生類型:

class X {}; 
class Y : X { 
public: 
    typedef X X; 
}; 
class Z : Y { 
    X x; 
}; 

最後一個選項作品因爲它會在Y內部添加一個X標識符public並引用該類型,因此編譯器將在那裏找到該類型並使用Z中的類型。

+0

+1很好的答案,我學會了今天以不同的方式使用'class'。 –

+0

你的「下一個選項」(「class X x;」)是錯誤的。這是行不通的 - 它只是相同的,並且指的是私人繼承的注入類名,因此無法訪問。你似乎錯誤地認爲注入的類名是一個對象而不是一個類型。注入的類名稱是指一個類,並且是一個類型名稱。 –

+0

@Johannes:是的,你說得對,我有這種誤解。其實我試圖在標準中看到這個(g ++接受4.2/4.7,但是clang ++和comeau拒絕它)。看來,'X x類'和'身份 :: type'都失敗了。 –

9

好問題,我找不到一種方法來做到這一點。我看到的唯一的選擇是引入的Z類型定義之外:

typedef X PITA; 
class Z : public Y 
{ 
public: 
    PITA x; // ok 
}; 
相關問題