簡體   English   中英

CRTP訪問受保護的CTOR派生

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM