Пересылка аргументов в конструктор вместе с дополнительными аргументами

Я пытаюсь сделать следующее:

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)
     {
        ...
     }
};

Я получаю следующую ошибку компилятора:

ошибка: нет соответствующей функции для вызова ‘ns::Widget::Widget(int)’

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

Это не соответствует моему конструктору с двумя аргументами. Кажется, игнорирует (i+startingID). Нельзя ли вместе с переадресацией добавить дополнительные аргументы?


person SubliminalBroccoli    schedule 31.07.2018    source источник
comment
если бы вы создали минимально воспроизводимый пример, который действительно помог бы нам помочь вам. Я ожидаю, что скопирую ваш код в компилятор и сам увижу проблему. Вместо этого я использую необъявленный идентификатор MyClass. Создайте минимально воспроизводимый пример   -  person bolov    schedule 01.08.2018


Ответы (1)


Ваш код неполный. Это заставляет нас делать предположения о недостающих частях вашего кода.

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

Предполагая, что args... равно widgettype, а T равно Widget, код после подстановки расширяется до:

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

а также

new (itr) Widget(widgettype)

Чтобы код был действительным, оба Widget(i + startingID, widgettype) и Widget(widgettype) должны быть действительными. Вы показываете только Widget::Widget(int64_t id, int32_t type) ctor. Если у вас нет ctor, принимающего аргумент int32_t, тогда код недействителен.

Вот что говорит вам сообщение об ошибке:

нет соответствующей функции для вызова ‘ns::Widget::Widget(int)’

Вы можете быть сбиты с толку, потому что сообщение об ошибке может быть помещено в начало полного выражения, содержащего ошибку — первой строки присваивания, но на самом деле оно исходит из второй строки, new (itr) T(std::forward<Args>(args)...); Опять же, это обоснованное предположение, так как вы не предоставили MCVE.

person bolov    schedule 31.07.2018