C++ 解决C++;操作员新的歧义(如何强制)?

C++ 解决C++;操作员新的歧义(如何强制)?,c++,syntax,g++,c++11,C++,Syntax,G++,C++11,我的代码(尚未发布,在文件iaca.hh中)处于打开状态 我在Debian/Linux/Sid AMD64上使用GCC4.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 m

我的代码(尚未发布,在文件
iaca.hh
中)处于打开状态 我在Debian/Linux/Sid AMD64上使用GCC4.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)
我不知道强制
运算符新建的正确语法是什么。我希望在我的
iaca.hh
文件末尾的函数
IaDictionnaryItem::make
中调用类
IaAnyValue
中的一个

我引入了空的
allocate_new_value
来解决歧义,但没有成功

我试过了,但没有成功

IaDictionnaryItem* IaDictionnaryItem::make() {
  return new(IaAnyValue::allocate_new_value) IaDictionnaryItem;
}

据我所知,new运算符总是以sizeof(*this)作为隐式第一个参数来调用,等等

关于我的问题的一些动机正在讨论中。请不要告诉我我不应该使用Boehm的GC。我需要使用它(否则我不会使用C++)

强制调用好的运算符new的正确语法是什么

我希望使用Boehm的GC分配器。它可以通过
gc\u cleanup
类获得,该类位于
class IaItemValue:public IaAnyValue,gc\u cleanup
中,也可以作为
新的
在我的
class IaAnyValue
中(唯一的
IaDictionnaryItem
)我同意存在歧义,我只是不想用什么语法来强制它

那么,我应该如何在文件末尾编写我的琐碎的
IaDictionnaryItem::make
,才能成功编译它呢

为了可读性,我更喜欢使用
sz=sizeof(*this)
调用
IaAnyValue::operator new
,即
sizeof(IaDictionnaryItem)
gap=0
al=allocate\u new\u value
。我只是想不出强制调用这个特定函数的语法(当然,我仍然希望在
IaDictionnaryItem::make
中调用
IaDictionnaryItem
的构造函数)

我已经尝试强制
gc::操作符新建(size\u t size,gcp)
gc
类由
gc\u cleanup
继承)

My
make
函数是一个静态函数,返回对象的新实例。请记住,我使用的是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;
}
#包括
结构A{};
结构B{void*运算符new(std::size_t,A);};
结构C{};
结构D{void*运算符new(std::size_t,C);};
结构E:B,D{};
int main()
{
//我想使用`void*D::operator new(std::size\u t,C);`来分配内存
//但是它不会编译,因为对操作符new的调用是不明确的。
新的(C())E;
}

为了理解您的问题,我仔细阅读了您的代码,可以做出以下断言:

  • IaAnyValue::allocate_new_value
    是一个
    struct allocate_new_value{}
  • GCPlacement
    是一个
    enum{NoGC,PointerFreeGC}
您有三个已定义的
运算符:

void* operator new(size_t);               
void* operator new(size_t, GCPlacement);  
void* operator new(size_t, void*);        
你需要明确你所说的

要调用
新建(尺寸)

要调用
新建(尺寸、GCPlacement)

调用
新建(大小,无效*)


您的问题是多重继承问题。请注意,类
IaItemValue
继承自
IaAnyValue
gc\u cleanup
(和
IaDictionnaryItem
继承自
IaItemValue
),两者都为
操作符new
提供重载。为了解决此问题,您可以在
IaDictionnaryItem
的类定义中添加以下行:


使用IaAnyValue::operator new

在这一点上,我会使用编译器。这是模棱两可的。您要调用三个已定义的
new
运算符中的哪一个
new(size\u t,void*)
?如果为类重载
new
delete
运算符,则这些运算符将替换全局
new
delete
运算符,并将导致对对象的已定义运算符的调用,您不需要显式地调用它们。也许我同意这种模糊性(我很清楚GCC几乎总是正确的;我自己也在研究GCC:-)。我只是不太清楚C++技巧来强迫它。我对我的问题进行了编辑,以作进一步解释。我仍然不知道你想调用这三个问题中的哪一个。它们中的任何一个都可以,它们都调用
GC\u MALLOC
。我只是想不出语法来强制其中一个特定的3。。。为了可读性,我更喜欢使用
sz=sizeof(*this)
gap=0
al=allocate\u new\u value
调用
IaAnyValue::operator new
,但我认为如果你给我一个解决方案,我可以适应。谢谢!!几乎是对的,但我不明白最后的答案。我创建了空的
结构allocate\u new\u value\u st
,精确地(人为地)消除歧义。我试着使用
returnnew(UseGC)IaDictionnaryItem
,但我仍然得到了错误…我编辑了我的问题,解释了我试图遵循您的建议的原因。我不想要
new(NoGC)
但是
new(UseGC)
出于好奇,是否有一些语法可以通过强制调用
operator new
(带有构造步骤)的特定情况???@BasileStarynkevitch:Yes有:
IaAnyValue::operator new()
。不幸的是,这并不是特别有用,因为无法手动调用分配内存的构造函数,而对
new
的调用最终总是能够解析重载的
运算符new
s。还请注意,
BaseClass::functionName
语法可用于
操作符new
以外的其他内容。
#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;
}
void* operator new(size_t);               
void* operator new(size_t, GCPlacement);  
void* operator new(size_t, void*);        
new X;
new(NoGC) X;
allocate_new_value_st Y;
new(&Y) X;