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)