在C++中访问模板类的私有构造函数

mak*_*kar 2 c++ templates friend

我在尝试访问派生类的私有构造函数时遇到了一些困难,该派生类被指定为模板参数.我希望指定friend T可以解决问题,但不幸的是它没有效果.

template <typename T>
class Creator
{
public:

    static void Create()
    {
        instance = new T;
    }
private:
    static T* instance;
    friend T;
};

template <typename T>
T* Creator<T>::instance(nullptr);

class Test
{
private:
    Test() {}
};
Run Code Online (Sandbox Code Playgroud)

创作尝试:

int main()
{
     Creator<Test>::Create();
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

错误C2248'Derived :: Derived':无法访问类'Derived'中声明的私有成员

我有什么想法可以解决这个问题吗?

bku*_*ytt 5

您的Creator类不需要让朋友访问其模板参数.

template <typename T>
class Creator
{
public:

    static void Create()
    {
        instance = new T;
    }
private:
    static T* instance;
    // friend T; NOT USEFUL
};
Run Code Online (Sandbox Code Playgroud)

您需要从具有私有成员的类提供好友访问权限.

class Test
{
    friend Creator<Test>; // provide friend access to Creator<Test> specialization
private:
    Test()
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

这允许您的代码编译并获得您想要的行为.

作为一个注释,通过friend T;在模板类中声明,您实际上是将您的私有成员暴露给您专门用于Creator的任何T.你可以因此有人写...

class Test
{
private:
    Test()
    {
        // you don't really want this, do you?
        delete Creator<Test>::instance;
    }
};
Run Code Online (Sandbox Code Playgroud)

......如果他们使用了你的创作者模板.