C++ 将参数与其他参数一起转发到构造函数
我正在努力做到以下几点:C++ 将参数与其他参数一起转发到构造函数,c++,compiler-errors,perfect-forwarding,C++,Compiler Errors,Perfect Forwarding,我正在努力做到以下几点: 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) {
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;
}
}
模板
bool MyClass::CreateArray(T*&array\uux,Handle*&Handle\ux,const std::string&
handleName、int64\u t size、int64\u t startID、Args…Args)
{
array=ns::makearray(_段、大小、缓存线大小、startID、std::forward(args)…);
句柄=ns::构造(数组);
}
名称空间ns{
样板
T*makearray(内存和段、大小、大小对齐、int64开头、Args…Args)
{
void*ptr=段.alloc(尺寸(T)*尺寸,对齐);
//验证对齐
断言((静态强制转换(ptr)-静态强制转换(0))%alignment==0);
T*tPtr=静态铸件(ptr);
T*itr=tPtr;
对于(int64_t i=0;i
使用:
CreateArray(\u array、\u arrayHandle、\u arrayname、\u size、\u startingId、\u widgettype);
//startingID为int64\u t,widgettype为int32\u t
类小部件
{
公众:
Widget::Widget(int64\u t id,int32\u t类型)
{
...
}
};
我收到以下编译器错误:
错误:对“ns::Widget::Widget(int)”的调用没有匹配的函数
T*obj=startID?新(itr)T(i+起始ID,标准::转发(args)…)
它与我的2参数构造函数不匹配。似乎忽略了(i+startingID)
。
您不能在转发时添加其他参数吗?您的代码不完整。这迫使我们对代码中缺失的部分做出假设 及 要使代码有效,则
小部件(i+startingID,widgettype)
和小部件(widgettype)
都必须有效。您只显示一个Widget::Widget(int64\u t id,int32\u t type)
ctor。如果没有接受int32\t
参数,则代码无效
这是错误消息告诉您的:
对“ns::Widget::Widget(int)”的调用没有匹配的函数
您可能会感到困惑,因为错误消息可能放在包含错误的完整表达式的开头—赋值的第一行,但实际上它来自第二行,即new(itr)T(std::forward(args)代码>同样,这是一个有根据的猜测,因为您还没有提供MCVE。如果您想创建一个真正有助于我们帮助您的MCVE。我希望在编译器中复制粘贴您的代码,并亲自查看问题所在。相反,我得到了“使用未声明的标识符‘MyClass’”。请创建一个
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)
{
...
}
};
T* obj = startID ? new (itr) T(i+startingID, std::forward<Args>(args)...)
T* obj = startID ? new (itr) T(i+startingID, std::forward<Args>(args)...)
: new (itr) T(std::forward<Args>(args)...);
new (itr) Widget(i + startingID, widgettype)
new (itr) Widget(widgettype)