解决C ++运算符的新歧义(如何强制它)?

时间:2011-11-20 16:26:46

标签: c++ syntax g++ c++11

我的代码(尚未发布,位于文件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 IaAnyValueIaDictionnaryItem的唯一超类)同意存在歧义,我只是不猜测强迫它的语法。

那么我应该如何在文件末尾对我的琐碎IaDictionnaryItem::make进行编码以使其成功编译?

为了便于阅读,我更倾向于使用IaAnyValue::operator new sz=sizeof(*this)sizeof(IaDictionnaryItem)gap=0al=allocate_new_value来呼叫IaDictionnaryItem。我只是无法弄清楚强制调用这个特定的语法的语法(当然,我仍然希望在IaDictionnaryItem::make内调用gc::operator new(size_t size, GCPlacement gcp)的构造函数。)

我尝试使用

强制gcgc_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}}

2 个答案:

答案 0 :(得分:4)

您的问题是多重继承问题。请注意,类IaItemValue继承自IaAnyValuegc_cleanupIaDictionnaryItem继承自IaItemValue),两者都为operator new提供了重载。要解决此问题,您可以将以下行添加到IaDictionnaryItem的类定义中:

using IaAnyValue::operator new;

答案 1 :(得分:2)

为了理解您的问题,我已经挖掘了您的代码,并可以进行以下断言:

  • IaAnyValue::allocate_new_valuestruct allocate_new_value_st {}
  • GCPlacementenum { 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;