2016-01-28 87 views
0

讓我們考慮下面的代碼:爲什麼crtp適用於結構而不適用於課堂?

template<typename T> 
struct Base{ 
}; 
struct Derived: Base<Derived>{ 
}; 
int main() { 
    Base<Derived>* base_ptr = new Derived(); 
} 

和它的作品,我的意思是編譯。而同樣的版本,對於類:

template<typename T> 
class Base{ 
}; 
class Derived: Base<Derived>{ 
}; 
int main() { 
    Base<Derived>* base_ptr = new Derived(); 
//ERROR ‘Base<Derived>’ is an inaccessible base of ‘Derived’ 
} 

回答

5

因爲對於一個結構的基類的缺省訪問是public,和一類是private

使用

class Derived: public Base<Derived>{ 
       ^^^^^^ 

,使其等同於第一個例子。

這有沒有關係CRTP,你得到完全相同的錯誤,而不CRTP:

class Base { }; 
class Derived : Base { }; 
Base* base_ptr = new Derived(); 
+0

@AngelusMortis,我不明白您的評論,對不起。這個問題與CRTP無關,所以我不明白爲什麼使用它的例子會有所幫助。 –

相關問題