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
の場合、すべて正常です。
構文の微妙な部分がありますか?これはテンプレートの制限ですか?
: は、そうでない場合は、あなたがから派生クラスごとの公開」または「保護された」キーワードを使用する必要があります。 "クラス"を定義するとき、常に単一と複数の継承でプライベートにデフォルト設定されます。 "struct"を定義するとき、常にstructに、また単一継承と多重継承でデフォルトになります。また、 "public/private"キーワードは、それが付随する親クラスだけに影響すると述べています。OPの実際の問題であるすべての親クラスではありません。 – LoPiTaL
OK、私はより一般的な答えを変更しました。 – Trantor
Err ...エラーメッセージに可視性についての言及がなかったので、私はそれについて考えなかった... 私のサブクラスのコンストラクタはプライベートでなければならないという問題がありました...私は友達クラス –