Ошибка компиляции Python (привязка C ++)

я пытаюсь реализовать массив в моем c ++ моделировании (эта кодировка должна иметь 2 значения в одном поле сетевого пакета)

это мое объявление переменной (в заголовке)

 Ptr<Name> m_names [2];

это объявление моей функции (в шапке)

void SetName (unsigned which, Ptr<Name> name);
void SetName (unsigned which, const Name &name);

в исходном файле

void Interest::SetName (unsigned which, Ptr<Name> name)
{
if (which < 2)
{
m_names[which] = name;
}
}

void Interest::SetName (unsigned which, const Name &name)
{
if (which < 2)
{
m_names[which] = Create<Name> (name);
}
}

Вот как я это называю (в моем основном файле):

interest->SetName (0, nameWithSequence);
interest->SetName (1, nameWithNextSequence);

в результате это дает ошибку, как это

src/ndnSIM/bindings/ns3module.cc: In function ‘PyObject* _wrap_PyNs3NdnData_SetName__0(PyNs3NdnData*, PyObject*, PyObject*, PyObject**)’:
src/ndnSIM/bindings/ns3module.cc:8418:62: error: no matching function for call to ‘ns3::ndn::Data::SetName(ns3::Ptr<ns3::ndn::Name>)’
src/ndnSIM/bindings/ns3module.cc:8418:62: note: candidates are:
./ns3/ndn-data.h:60:3: note: void ns3::ndn::Data::SetName(unsigned int, ns3::Ptr<ns3::ndn::Name>)
./ns3/ndn-data.h:60:3: note:   candidate expects 2 arguments, 1 provided

вопрос в том, как правильно я должен объявить правильное утверждение. Ценю любую помощь

РЕДАКТИРОВАТЬ
Я нашел некоторые из определения pyhton, чтобы связать мой код C ++ (SetName)

def __setattr__(self, name, value):
if name == "_interest":
return object.__setattr__ (self, name, value)

elif name == "name":
if value is None:
return self._interest.SetName (ns.ndnSIM.ndn.Name ())
elif isinstance (value, Name):
return self._interest.SetName (value._name)
elif isinstance (value, ns.ndnSIM.ndn.Name):
return self._interest.SetName (value)
elif isinstance (value, str):
return self._interest.SetName (ns.ndnSIM.ndn.Name (value))
else:
raise ValueError ("Invalid name parameter")

Как и как правильно решить эту проблему. Спасибо

1

Решение

Хорошо, позвольте мне привести вам пример.
Я предполагаю Ptr действует что-то вроде std::shared_pointer, а также Name как std::string (по крайней мере, для примера).

Прежде всего, я бы порекомендовал использовать std::array вместо массива в стиле c. Но это не совсем необходимо.
Во-вторых. Если вы планируете m_names чтобы быть массивом размера fidex, вы можете выдать исключение при доступе к несуществующему члену.

Вот код
Заголовок (test.h):

#include <string>
#include <memory>
#include <array>

typedef std::shared_ptr<std::string> pString;

struct A{
protected:
static constexpr size_t array_size = 2;
std::array<pString, array_size> m_names;
static void CheckRange(size_t);
public:
void SetName(size_t id, const std::string& name);
void SetName(size_t id, const pString& name);

const std::string& GetName(size_t id) const;
const pString& GetNamePtr(size_t id) const;
};

Источник:

#include "test.h"#include <exception>

void A::SetName(size_t id, const pString &name){
CheckRange(id);
m_names[id] = name;
}

void A::SetName(size_t id, const std::string& name){
CheckRange(id);
m_names[id] = std::make_shared<std::string>(name);
}

const std::string& A::GetName(size_t id) const{
CheckRange(id);
if (!m_names[id])
throw std::logic_error("Pointer is not initialized");
return *(m_names[id].get());
}

const pString& A::GetNamePtr(size_t id) const {
CheckRange(id);
return m_names[id];
}

И вот пример CheckRange функция:

void A::CheckRange(size_t id){
if (!(id < array_size))
throw std::logic_error("ID should be < " +
std::to_string(array_size));
}

Этот код с некоторыми тестами: http://ideone.com/rUvVhH

намек

if (m_names[id]) проверяет, если m_names[id] содержит действительный указатель (например, не nullptr). Я полагаю Ptr имеет схожий функционал.
И я верю std::make_shared<T>(...) похож на Create<T>(...),

Ну, а для меня это более-менее правильный способ получения содержимого массива 🙂
Если что-то будет слишком сложным, я постараюсь облегчить понимание.
Вы можете задать, если у вас есть какие-либо вопросы!

0

Другие решения

Ошибка во время компиляции в коде привязки Python. Так,

  1. Если вы написали код привязки (оболочки) самостоятельно (используя Python C API или boost :: python), вы должны найти, где вы определяете привязку SetName, в нем отсутствует параметр.

  2. Если привязка автоматически генерируется каким-либо инструментом (например, SWIG или SIP), вы должны найти, где определена привязка SetName: это то, что инструмент-обертка будет использовать, чтобы выяснить, какой код генерировать, ошибка в этом определении.

Код Python, который вы добавили в свой пост, SetAttr, ясно указывает, что вызовы self._interest.SetName (obj) неверны: ваш C ++ показывает, что SetName принимает два параметра. Если SetAttr генерируется каким-то инструментом (ns3?), вы должны выяснить, как он это делает, чтобы дать ему правильное определение SetName, чтобы SetAttr будет иметь правильный звонок.

0

По вопросам рекламы [email protected]