ошибка: несоответствие типа/значения в аргументе 1 в списке параметров шаблона для ‘template‹class _Tp, class _Dp› class std::unique_ptr’

Прежде чем мы начнем, я полный нуб в C++11, использовал C несколько лет назад.

Я пытаюсь написать привязку python к коду С++ 11, используя pybind11, и получаю ошибку subjected. В основном я следую этому руководству от Nvidia. народ и застрял на этой ошибке. Может ли какая-нибудь хорошая душа указать мне правильное направление?

Определение:

template<int zoom_factor>
class UpSamplePlugin: public nvinfer1::IPluginExt
{
public:
    UpSamplePlugin() {}

    // Create the plugin at runtime from a byte stream.
    UpSamplePlugin(const void* buffer, size_t size)
    {
        assert(size == sizeof(mInputDims)); // assert datatype of input
        mInputDims = *reinterpret_cast<const nvinfer1::Dims*>(buffer);
    }
...
}

Позвонить:

py::class_<UpSamplePlugin, nvinfer1::IPluginExt, std::unique_ptr<UpSamplePlugin, py::nodelete>>(m, "UpSamplePlugin")
        // Bind the normal constructor as well as the one which deserializes the plugin
        //.def(py::init<const nvinfer1::Weights*, int>())
        .def(py::init<const void*, size_t>())
    ;

Ошибка:

/media/.../plugin/pyUpSample.cpp: In function ‘void pybind11_init_upsampleplugin(pybind11::module&)’:
/media/.../plugin/pyUpSample.cpp:13:90: error: type/value mismatch at argument 1 in template parameter list for ‘template<class _Tp, class _Dp> class std::unique_ptr’
     py::class_<UpSamplePlugin, nvinfer1::IPluginExt, std::unique_ptr<UpSamplePlugin, py::nodelete>>(m, "UpSamplePlugin")
                                                                                          ^
/media/.../plugin/pyUpSample.cpp:13:90: note:   expected a type, got ‘UpSamplePlugin’

person Khurram Amin    schedule 06.10.2018    source источник


Ответы (1)


Типа с именем UpSamplePlugin не существует, это просто шаблон. Итак, вы должны сделать что-то вроде UpSamplePlugin<T>. В вашем случае это должно быть UpSamplePlugin<zoom_factor>

Попробуйте следующий код, если это объявление находится внутри шаблона:

py::class_<UpSamplePlugin<zoom_factor>, nvinfer1::IPluginExt, std::unique_ptr<UpSamplePlugin, py::nodelete>>(m, "UpSamplePlugin")
    // Bind the normal constructor as well as the one which deserializes the plugin
    //.def(py::init<const nvinfer1::Weights*, int>())
    .def(py::init<const void*, size_t>())
;

Компилятор "создаст" новый тип, соответствующий UpSamplePlugin<zoom_factor>.

Если его нет в шаблоне:

Создайте еще один шаблон (это может быть функция шаблона), который можно вызвать с любым константным типом zoom_factor:

template<int zoom_factor>
void doSomething() {
    py::class_<UpSamplePlugin<zoom_factor>, nvinfer1::IPluginExt, std::unique_ptr<UpSamplePlugin, py::nodelete>>(m, "UpSamplePlugin")
    // Bind the normal constructor as well as the one which deserializes the plugin
    //.def(py::init<const nvinfer1::Weights*, int>())
    .def(py::init<const void*, size_t>())
;    
}

Затем вы можете вызывать эту функцию с любым ИЗВЕСТНЫМ ВРЕМЕНЕМ КОМПИЛЯЦИИ zoom_factor

person user9335240    schedule 06.10.2018