[英]CRTP access to protected CTOR in derived
我查看了stackoverflow,我沒有看到我的確切問題,所以我發布了它。 我用cxx03構建它,所以不允許使用cxx11 +功能。
我有以下簡化的插圖:
template<typename T>
struct unprotect : public T {
static T *create(void) {
return new T;
}
};
template<class T>
struct Base
{
private:
public:
static T * Create(void) {
return unprotect<T>::create();
}
static void Destroy(T *p) {
delete p;
}
};
struct Derived : public Base<Derived>
{
protected:
Derived(void){}
};
int main(int argc,const char** argv)
{
Derived * d = Derived::Create();
Derived::Destroy(d);
return( 0 );
}
這會在g ++ v4.8中產生以下錯誤:
24)~/workspace/tricks $ g++ src/tricks.cpp
src/tricks.cpp: In instantiation of 'static T* unprotect<T>::create() [with T = Derived]':
src/tricks.cpp:14:37: required from 'static T* Base<T>::Create() [with T = Derived]':
src/tricks.cpp:29:28: required from here
src/tricks.cpp:24:5: error: 'Derived::Derived()' is protected
Derived(void){}
^
src/tricks.cpp:4:20: error: within this context
return new T;
我原以為,由於unprotect繼承自T,unprotect :: create()可以訪問派生類'protected constructor。
真的很簡單:使用CRTP,我希望Base能夠添加一個create()方法,該方法可以訪問衍生的CTOR,但不需要Derived聲明與Base的友誼 。
一個糟糕的方法是做類似以下的事情:
template<typename T>
struct unprotect : public T {
static T *create(void) {
return new unprotect;
}
};
這將超越最初的問題,但它會對(純粹的)虛擬產品猶豫不決,並且很可能會導致一兩個令人討厭的驚喜。
有沒有辦法讓原始實現工作? 同樣,我不希望添加基地友誼派生。
不幸的是,在C ++中你不能做你想做的事情。 您要么必須在Derived
編寫公共創建函數,要么允許其構造函數是公共的(您在這里嘗試用受保護的構造函數解決什么問題?)。
所有受保護的手段都是派生類的this
指針可用於訪問父類的受保護成員。 它不授予子類任意訪問任意父類實例的任意受保護成員的權限(包括實例剛剛由new
創建)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.