我的代码(尚未发布,位于文件iaca.hh
中)位于pastebin: Basile Iaca C++ new conflict
我在Debian / Linux / Sid AMD64上使用GCC 4.6和C ++ 11方言。
g++ -std=c++0x -Wall -Wextra -g -O -flto -I/usr/local/include -o iaca.hh.gch iaca.hh
iaca.hh:631:2: warning: #warning should implement the methods [-Wcpp]
iaca.hh: In static member function 'static IaDictionnaryItem* IaDictionnaryItem::make()':
iaca.hh:964:46: error: request for member 'operator new' is ambiguous
/usr/local/include/gc/gc_cpp.h:304:14: error: candidates are: static void* gc::operator new(size_t, void*)
/usr/local/include/gc/gc_cpp.h:296:14: error: static void* gc::operator new(size_t, GCPlacement)
/usr/local/include/gc/gc_cpp.h:293:14: error: static void* gc::operator new(size_t)
iaca.hh:675:7: error: static void* IaAnyValue::operator new(size_t, IaAnyValue::allocate_new_value_st)
iaca.hh:667:7: error: static void* IaAnyValue::operator new(size_t, size_t, IaAnyValue::allocate_new_value_st)
我无法弄清楚强制operator new
的正确语法是什么。我希望在我的IaAnyValue
文件末尾的函数IaDictionnaryItem::make
中调用我的班级iaca.hh
中的一个
我已经引入了空allocate_new_value
来解决歧义,但没有成功。
我尝试没有成功
IaDictionnaryItem* IaDictionnaryItem::make() {
return new(IaAnyValue::allocate_new_value) IaDictionnaryItem;
}
和
IaDictionnaryItem* IaDictionnaryItem::make() {
return IaAnyValue::operator new(IaAnyValue::allocate_new_value) IaDictionnaryItem;
}
据我所知,operator new始终以sizeof(* this)作为隐式第一个参数调用,等等。
关于我的问题的一些动机是this question about Boehm's GC & C++。请不要告诉我我不应该使用Boehm的GC。我需要使用它(否则我不会使用C ++)。
强制调用good运算符new的正确语法是什么?
我希望使用Boehm的GC分配器。它可以通过gc_cleanup
类使用,该类位于class IaItemValue : public IaAnyValue, gc_cleanup
中,也可以作为new
中的class IaAnyValue
(IaDictionnaryItem
的唯一超类)同意存在歧义,我只是不猜测强迫它的语法。
那么我应该如何在文件末尾对我的琐碎IaDictionnaryItem::make
进行编码以使其成功编译?
为了便于阅读,我更倾向于使用IaAnyValue::operator new
sz=sizeof(*this)
,sizeof(IaDictionnaryItem)
,gap=0
和al=allocate_new_value
来呼叫IaDictionnaryItem
。我只是无法弄清楚强制调用这个特定的语法的语法(当然,我仍然希望在IaDictionnaryItem::make
内调用gc::operator new(size_t size, GCPlacement gcp)
的构造函数。)
我尝试使用
强制gc
(gc_cleanup
类由<gc/gc_cpp.h>
继承IaDictionnaryItem* IaDictionnaryItem::make() {
return new (UseGC) IaDictionnaryItem;
}
make
我的delete
函数是一个静态函数,返回我的对象的新实例。请记住,我正在使用Beohm的GC,当没有指针指向它时,它最终将释放所使用的内存(和iaca.hh: In static member function 'static IaDictionnaryItem* IaDictionnaryItem::make()':
iaca.hh:962:22: error: request for member 'operator new' is ambiguous
/usr/local/include/gc/gc_cpp.h:304:14: error: candidates are: static void* gc::operator new(size_t, void*)
/usr/local/include/gc/gc_cpp.h:296:14: error: static void* gc::operator new(size_t, GCPlacement)
/usr/local/include/gc/gc_cpp.h:293:14: error: static void* gc::operator new(size_t)
iaca.hh:675:7: error: static void* IaAnyValue::operator new(size_t, IaAnyValue::allocate_new_value_st)
iaca.hh:667:7: error: static void* IaAnyValue::operator new(size_t, size_t, IaAnyValue::allocate_new_value_st)
对象)。
但我还是得到了
#include <cstddef>
struct A {};
struct B { void* operator new(std::size_t, A); };
struct C {};
struct D { void* operator new(std::size_t, C); };
struct E : B, D {};
int main()
{
//I want to use `void* D::operator new(std::size_t, C);` to allocate memory
//but it will not compile because the call to operator new is ambiguous.
new(C()) E;
}
问候。
编辑:以下是问题的简单示例:
{{1}}
答案 0 :(得分:4)
您的问题是多重继承问题。请注意,类IaItemValue
继承自IaAnyValue
和gc_cleanup
(IaDictionnaryItem
继承自IaItemValue
),两者都为operator new
提供了重载。要解决此问题,您可以将以下行添加到IaDictionnaryItem
的类定义中:
using IaAnyValue::operator new;
答案 1 :(得分:2)
为了理解您的问题,我已经挖掘了您的代码,并可以进行以下断言:
IaAnyValue::allocate_new_value
是struct allocate_new_value_st {}
GCPlacement
是enum { NoGC, PointerFreeGC }
您有三个已定义的new
运算符:
void* operator new(size_t);
void* operator new(size_t, GCPlacement);
void* operator new(size_t, void*);
你需要具体说明你的所谓。
致电new(size_t)
:
new X;
致电new(size_t, GCPlacement)
:
new(NoGC) X;
致电new(size_t, void*)
:
allocate_new_value_st Y;
new(&Y) X;