C++ CRTP访问派生中受保护的CTOR

C++ CRTP访问派生中受保护的CTOR,c++,C++,我环顾了一下stackoverflow,没有看到我的确切问题,所以我发布了它。我使用cxx03构建此功能,因此不允许使用cxx11+功能 我有以下简化的说明: template<typename T> struct unprotect : public T { static T *create(void) { return new T; } }; template<class T> struct Base { private: publi

我环顾了一下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 );
}
模板
结构取消保护:公共T{
静态T*创建(无效){
返回新的T;
}
};
模板
结构基
{
私人:
公众:
静态T*创建(无效){
返回unprotect::create();
}
静态空洞破坏(T*p){
删除p;
}
};
结构派生:公共基
{
受保护的:
派生(空){}
};
int main(int argc,常量字符**argv)
{
派生*d=派生::创建();
衍生工具(d);
返回(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;
24)~/workspace/tricks$g++src/tricks.cpp
src/tricks.cpp:在“static T*unprotect::create()[with T=Derived]”的实例化中:
src/tricks.cpp:14:37:来自“static T*Base::Create()[with T=Derived]”的必需项:
src/tricks.cpp:29:28:此处为必填项
src/tricks.cpp:24:5:错误:“派生::派生()”受保护
派生(空){}
^
src/tricks.cpp:4:20:错误:在此上下文中
返回新的T;
我本以为,由于unprotect继承自T,因此unprotect::create()可以访问派生类的受保护构造函数

这就是问题所在,真的:使用CRTP,我希望Base能够添加一个create()方法,该方法可以访问派生的CTOR,但不要求派生与Base建立友谊

一种不好的方法是执行以下操作:

template<typename T>
struct unprotect : public T {
    static T *create(void) {
        return new unprotect;
    }
};
模板
结构取消保护:公共T{
静态T*创建(无效){
返回新的未保护;
}
};
这将克服最初的问题,但它会阻碍(纯)虚拟,并且很可能会引起一两个令人讨厌的惊喜


是否有办法使最初的实施工作正常?再次,我强烈地不想添加基础友谊。

< P>不幸的是C++不能做你想做的事情。您要么必须在
派生的
中编写public create函数,要么允许它的构造函数是公共的(您试图用受保护的构造函数解决什么问题?)


所有受保护的意思是派生类的
指针可以用来访问父类的受保护成员。它不会授予子类对任意父类实例的任意受保护成员的任意访问权限(包括该实例刚由
new
创建的情况)。

Base
访问
派生的
a
static\u cast
?您可能需要某种注入函数指针操作,我几乎同意这一点,只是我的第二个版本template unprotect工作得很好,所以它确实具有这种访问权限;否则它无法构造自己。@zap foster从直觉上看,
unprotect
可以创建自己。