gpt4 book ai didi

c++ - 在派生类中重载新运算符

转载 作者:行者123 更新时间:2023-11-30 01:12:37 26 4
gpt4 key购买 nike

我在 Base 类中重载了 new 运算符。但是,当我向派生类添加额外的重载 new 时,gcc 编译器在 Base 类中找不到 new 运算符。为什么?

最好的, 亚历克斯

#include <stdlib.h>
template <class t> class Base {
public:
Base() {}
void * operator new (size_t size, void *loc) { return loc; }
};

template <class t> class Derived : public Base<t> {
public:
Derived() {}
void * operator new (size_t size, int sz, void *loc) { return loc; }

};

void foo() {
void *loc = malloc(sizeof(Derived<char>));
Derived<char> *d = new (loc) Derived<char>();
}

gcc 输出:

   new.cpp: In function ‘void foo()’:
new.cpp:17:45: error: no matching function for call to ‘Derived<char>::operator new(sizetype, void*&)’
Derived<char> *d = new (loc) Derived<char>();
^
new.cpp:17:45: note: candidate is:
new.cpp:11:10: note: static void* Derived<t>::operator new(size_t, int, void*) [with t = char; size_t = unsigned int]
void * operator new (size_t size, int sz, void *loc) { return loc; }
^
new.cpp:11:10: note: candidate expects 3 arguments, 2 provided

最佳答案

当您通过放置 new 表达式调用 operator new

new (loc) Derived<char>();

编译器在 Derived 类(而不是 Base 类)中查找 operator new 的重载。它找到了,但是你的重载

void * operator new (size_t size, int sz, void *loc) { return loc; }
// ^ additional parameter

接受更多参数,因此出现错误。

如果你问为什么编译器不够聪明,无法调用 Baseoperator new 重载,那是因为 name hiding : Derived 类中的 operator new 重载隐藏了 Base 类之一。如果你想让 Base::operator new 重载在你的 Derived 类中可见,使用

using Base<t>::operator new;

关于c++ - 在派生类中重载新运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33760672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com