2016-11-24 62 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

错误...因为没有提及错误信息中的可见性,所以我没有想到它... 我有我的子类构造函数应该是私人的问题...猜我会去与朋友类 –