2016-11-24 44 views
4

我有一種奇怪的(或者沒有)錯誤與下面的代碼: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> { 
} 

instance方法是在模板中,我得到了以下錯誤(海合會)

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

。定義一個「類」時,它總是默認爲私有的,在單一繼承和多重繼承中。當定義一個「結構」時,它總是默認爲結構,也是單一繼承和多重繼承。同時聲明「public/private」關鍵字僅影響到它所附帶的父類,而不是所有的父類,這是OP的實際問題 – LoPiTaL

+0

好的,我改變了我的答案以獲得更多的一般性。 – Trantor

+0

錯誤...因爲沒有提及錯誤信息中的可見性,所以我沒有想到它... 我有我的子類構造函數應該是私人的問題...猜我會去與朋友類 –