我有简单的代码
template <class T>
class SmartPointer //not completely implemented yet
{
T* ptr;
public:
void CrateObj()
{
ptr = new T;
}
};
class MyClass
{
private:
static void * operator new (size_t);
static void* operator new[] (size_t);
friend class SmartPointer<MyClass>;
};
int main()
{
SmartPointer<MyClass> a;
a.CrateObj();
return 0;
}
我收到了以下错误。
严重级代码描述项目文件行抑制状态 错误LNK2001未解析的外部符号&#34;私有:静态无效* __cdecl MyClass :: operator new(unsigned int)&#34; (?? 2MyClass @@ @ CAPAXI Z)
我想确保只有SmartPointer能够使用new创建实例。我怎样才能做到这一点?
答案 0 :(得分:3)
如果您只想为访问说明符重载它,但仍然调用默认的全局operator new
,则需要在自定义实现中明确调用它。重载决策不会使用您的自定义声明来自行调用全局函数。声明和调用的函数需要一个定义:
class MyClass
{
private:
static void* operator new (size_t sz) { return ::operator new(sz); }
static void* operator new[] (size_t sz) { return ::operator new[](sz); }
friend class SmartPointer<MyClass>;
};
虽然你应该知道它不会阻止知道该语言的坚定用户。他们也可以遵循全局分配功能:
int main()
{
SmartPointer<MyClass> a;
a.CrateObj();
auto* raw_ptr = ::new MyClass;
return 0;
}