gpt4 book ai didi

c++ - 将参数与其他参数一起转发给构造函数

转载 作者:行者123 更新时间:2023-11-28 04:35:16 25 4
gpt4 key购买 nike

我正在尝试执行以下操作:

template<typename T, typename Handle, typename... Args>
bool MyClass::CreateArray(T *&array_, Handle *&handle_, const std::string&
handleName_, int64_t size_, int64_t startID_,Args... args)
{
array_ = ns::makearray<T>(_segment,size_,CACHELINE_SIZE, startID_, std::forward<Args>(args)...);
handle_ = ns::construct<Handle>(array_);

}

namespace ns {

template<typename T, typename... Args>
T *makearray(mem &segment, size_t size, size_t alignment, int64_t startID, Args... args )
{
void* ptr = segment.alloc(sizeof(T) * size, alignment);

//verify alignment
assert((static_cast<char*>(ptr)-static_cast<char*>(0)) % alignment == 0);

T* tPtr = static_cast<T*>(ptr);
T* itr = tPtr;

for(int64_t i=0; i< size; ++i)
{
T* obj = startID ? new (itr) T(i+startingID, std::forward<Args>(args)...)
: new (itr) T(std::forward<Args>(args)...);
++itr;
}
return tPtr;
}
}

使用:

CreateArray<Widget,WidgetHandle>(_array,_arrayHandle,_arrayname,_size,_startingId,_widgettype);
//startingID is int64_t and widgettype is int32_t

class Widget
{
public:

Widget::Widget(int64_t id, int32_t type)
{
...
}
};

我收到以下编译器错误:

error: no matching function for call to ‘ns::Widget::Widget(int)’

         T* obj = startID ? new (itr) T(i+startingID, std::forward<Args>(args)...)

它与我的 2 arg 构造函数不匹配。似乎忽略了 (i+startingID)。您不能在转发的同时添加额外的参数吗?

最佳答案

您的代码不完整。这迫使我们对代码的缺失部分做出假设。

  T* obj = startID ? new (itr) T(i+startingID, std::forward<Args>(args)...)
: new (itr) T(std::forward<Args>(args)...);

假设args...widgettypeTWidget然后代码在替换后扩展为:

new (itr) Widget(i + startingID, widgettype)

new (itr) Widget(widgettype)

为了使代码有效,然后 Widget(i + startingID, widgettype)Widget(widgettype)必须有效。你只显示一个 Widget::Widget(int64_t id, int32_t type) Actor 。如果你没有接受 int32_t 的 ctor参数则代码无效。

这是错误消息告诉您的内容:

no matching function for call to ‘ns::Widget::Widget(int)’

您可能会感到困惑,因为错误消息可能位于包含错误的完整表达式的开头 - 赋值的第一行,但实际上它来自第二行,new (itr) T(std::forward<Args>(args)...);同样,这是一个有根据的猜测,因为您没有提供 MCVE。

关于c++ - 将参数与其他参数一起转发给构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51622222/

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