为什么我无法使私有运营商成为新的并使用默认实施?

时间:2018-01-30 06:17:44

标签: c++

我有简单的代码

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创建实例。我怎样才能做到这一点?

1 个答案:

答案 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;
}