2017-10-29 7 views
0

私は、重要な部分を公に公開することなく、私が整理しようとしているパズルを持っています。少なくとも、私はC2248の線に沿って、エラーを取得しています、のMicrosoft Visual C++ 2015コンパイラを使用して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> { 
}; 

、 'MyFeature :: MyFeatureは':クラスのMyFeature 'で宣言protectedメンバにアクセスすることはできません。

フィクスチャへのアクセスとフィクスチャアクセスを保護したいと考えています。本当に、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

はい、いいえ、FixtureはTから派生してはいけません.TがFixtureのメンバーに通知するのは本当にすべきです。 – mwpowellhtx

+0

そして、明らかに、はい、私はテンプレートとクラスなどを宣言していますが、そのためにはコンパイラはまだチョークしています。 – mwpowellhtx

+0

あなたのコメントは私には分かりません。私が提案した 'friend'宣言はあなたの問題を修正しました(あなたのMCVEにはエラーがなくコンパイルされています)、あなたはまだ何らかの問題があると言っていますか? –

関連する問題