在 C++ 中访问模板 class 的私有构造函数
Accessing a private constructor of a template class in C++
我在尝试访问指定为模板参数的派生 class 的私有构造函数时遇到了一些困难。我希望指定 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() {}
};
创建尝试:
int main()
{
Creator<Test>::Create();
}
我得到的错误是:
Error C2248 'Derived::Derived': cannot access private member declared in class 'Derived'
有什么办法可以解决这个问题吗?
您的 Creator class 不需要授予朋友访问其模板参数的权限。
template <typename T>
class Creator
{
public:
static void Create()
{
instance = new T;
}
private:
static T* instance;
// friend T; NOT USEFUL
};
您需要从拥有私人成员的 class 提供好友访问权限。
class Test
{
friend Creator<Test>; // provide friend access to Creator<Test> specialization
private:
Test()
{
}
};
这允许您的代码编译并获得您想要的行为。
请注意,通过在您的模板 class 中声明 friend T;
,您实际上是将您的私有成员暴露给您使用 Creator 专门处理的任何 T。因此,您可以让某人写...
class Test
{
private:
Test()
{
// you don't really want this, do you?
delete Creator<Test>::instance;
}
};
...如果他们使用了您的 Creator 模板。
我在尝试访问指定为模板参数的派生 class 的私有构造函数时遇到了一些困难。我希望指定 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() {}
};
创建尝试:
int main()
{
Creator<Test>::Create();
}
我得到的错误是:
Error C2248 'Derived::Derived': cannot access private member declared in class 'Derived'
有什么办法可以解决这个问题吗?
您的 Creator class 不需要授予朋友访问其模板参数的权限。
template <typename T>
class Creator
{
public:
static void Create()
{
instance = new T;
}
private:
static T* instance;
// friend T; NOT USEFUL
};
您需要从拥有私人成员的 class 提供好友访问权限。
class Test
{
friend Creator<Test>; // provide friend access to Creator<Test> specialization
private:
Test()
{
}
};
这允许您的代码编译并获得您想要的行为。
请注意,通过在您的模板 class 中声明 friend T;
,您实际上是将您的私有成员暴露给您使用 Creator 专门处理的任何 T。因此,您可以让某人写...
class Test
{
private:
Test()
{
// you don't really want this, do you?
delete Creator<Test>::instance;
}
};
...如果他们使用了您的 Creator 模板。