2016-11-24 8 views
4

私は次のコードで奇妙な(あるいはそうでないかもしれない)エラーがあります:instance方法はテンプレートにあるとき、私はエラー(GCC)C++ネストされたテンプレート:アクセスできない静的メソッド

を以下しまった

template<typename T> 
class Registrer { 
public: 
    Registrer() { 
     Registry::register(T::instance); 
    } 
}; 

template<typename T> 
class RegisteringClass { 
private: 
    static const Registrer<T> REGISTRER; 
public: 
    RegisteringClass() { Q_UNUSED(REGISTRER); /* force static instantiation  */ } 
    static const WhatEver *instance() { static T INSTANCE; return &INSTANCE; } 
}; 

template<typename T> 
const Registrer<T> RegisteringClass<T>::REGISTRER; 

class Something : public WhatEver, RegistringClass<Something> { 
} 

error: 'static const WhatEver* RegisteringClass<T>::instance() [with T = Something]' is inaccessible 
    static const WhatEver*instance() { static T INSTANCE; return &INSTANCE; } 
error: within this context 
    Registry::register(T::instance); 
In instantiation of 'static const WhatEver* RegisteringClass<T>::instance() [with T = Something]': 

instance()Somethingの場合、すべて正常です。

構文の微妙な部分がありますか?これはテンプレートの制限ですか?

答えて

3

クラスを生成するとき、 'private'がデフォルトです。複数のクラスを派生しない場合

class C : public A, public B 
{ 
    void f(); 
}; 
+0

: は、そうでない場合は、あなたがから派生クラスごとの公開」または「保護された」キーワードを使用する必要があります。 "クラス"を定義するとき、常に単一と複数の継承でプライベートにデフォルト設定されます。 "struct"を定義するとき、常にstructに、また単一継承と多重継承でデフォルトになります。また、 "public/private"キーワードは、それが付随する親クラスだけに影響すると述べています。OPの実際の問題であるすべての親クラスではありません。 – LoPiTaL

+0

OK、私はより一般的な答えを変更しました。 – Trantor

+0

Err ...エラーメッセージに可視性についての言及がなかったので、私はそれについて考えなかった... 私のサブクラスのコンストラクタはプライベートでなければならないという問題がありました...私は友達クラス –

関連する問題