公共运营商新的私人运营商删除:使用新的时候获取C2248"无法访问私人会员"

Max*_*xVT 19 c++ overloading compiler-errors

一个类重载了运算符newdelete.new是公开的,delete是私人的.

构造此类的实例时,我收到以下错误:

pFoo = new Foo(bar)
Run Code Online (Sandbox Code Playgroud)

example.cpp(1):错误C2248:'Foo:operator delete':无法访问类'Foo'中声明的私有成员

但是这里没有调用delete,所以在编译器的扭曲思想中发生了什么?:)

  1. 错误的原因是什么?
  2. 是否有可能在不诉诸成员CreateInstance函数的情况下解决问题?

sbi*_*sbi 27

当你这样做时new Foo()会发生两件事:首先operator new调用first 来分配内存,然后调用一个构造函数Foo.如果该构造函数抛出,因为您无法访问已分配的内存,C++运行时将通过将其传递给相应的内容来处理它operator delete.这就是为什么你总是必须operator deleteoperator new你写的每一个都实现一个匹配,这就是为什么它需要被访问.

作为一种出路,您可以将它们都设置为私有并operator new从公共成员函数(例如create())调用.