2017-10-29 24 views
0

我有一種難題我試圖理清,而不必公開暴露關鍵部分。整理出C++繼承訪問保護難題

template<class Feature> 
struct Fixture { 
private: 

    Feature f; 

protected: 
    Fixture() : f() {} 

public: 

    Feature* const get() { return &f; } 
}; 

struct MyFeature { 
protected: 
    MyFeature() {} 
}; 

struct FixtureHost : public Fixture<MyFeature> { 
}; 

至少使用微軟的Visual C++編譯器2015年,我相處C2248的線路錯誤,「我的功能::我的功能」:不能訪問類「我的功能」宣佈受保護的成員。

我想要訪問功能以及要保護的夾具訪問權限。真的,只有FixtureHost或友誼圈內的東西才能被允許實例化它們中的任何一個。

但是對於舊的C++編譯器來說,這看起來太過分了?如果我必須公開公開構造函數,那就這樣做吧,但是我想避免它。

+2

[朋友](http://en.cppreference.com/w/cpp/language/friend)? – happydave

+0

'朋友燈具;' – George

+0

請發表[MCVE](http://stackoverflow.com/help/mcve) –

回答

0

MyFeature的構造函數受到保護,但Fixture<MyFeature>試圖通過代碼f()訪問它。 protected表示只有當前的一個或多個類可以訪問該名稱,但Fixture<MyFeature>不是從MyFeature派生的。

你可以有MyFeature行添加到類定義:

friend class Fixture<MyFeature>; 

或考慮不同的設計,如使Fixture<T>T派生。

+0

是的,不,夾具不應該從T中派生出來。它確實應該是T通知夾具的​​成員。 – mwpowellhtx

+0

而且要清楚,是的,我已經向前宣佈了模板和類等,爲此,但編譯器仍然窒息。 – mwpowellhtx

+0

您的意見對我來說不清楚。我建議的'friend'聲明可以解決你的問題(如你現在編譯的MCVE中沒有錯誤所示),你是說你還有問題嗎? –