Пример работает, но мой код - нет.Это было связано с тем, что в моем коде векторный класс 1D был связан с типом Python в другом модуле pybind11 .Таким образом, не было сопоставленного типа Python для одномерного векторного типа C ++, когда он определил __getitem__
для двумерного векторного класса.Тем не менее, я думаю, что если я импортирую модуль, содержащий 1D-векторную привязку Python, то он должен работать, но это не так.Это может быть ошибкой.
РЕДАКТИРОВАТЬ:
Это поведение не ошибка (я подумал, Якоб, кажется, довольно умный парень).Как обсуждено в руководстве по связыванию контейнеров STL, есть раздел о «локальных» привязках модуля.По умолчанию привязки типов являются локальными для модуля, в котором они определены, чтобы избежать нескольких разных привязок одного типа.
Однако наш проект содержит модуль «типы данных» и многие модули, использующие эти типы.В этом случае мы не хотим, чтобы типы данных, определенные в модуле «типы данных», были локальными.В противном случае мы столкнемся с проблемой возврата значений, не преобразуемых в правильный тип Python.
Мы можем отключить локальную привязку модуля по умолчанию в определении привязки.Используя пример вопроса, мы можем отключить локальную привязку модуля для ExampleVector
, и доступ к Example2DVector
(определенному в другом модуле) больше не будет давать сбой.
pybind11::bind_vector<std::vector<Example>>(m, "ExampleVector", pybind11::module_local(false));