python编译错误(绑定c++)
Posted
技术标签:
【中文标题】python编译错误(绑定c++)【英文标题】:python compile error (binding c++) 【发布时间】:2014-01-22 04:12:24 【问题描述】:我试图在我的 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")
解决此问题的正确方法和方法是什么。谢谢
【问题讨论】:
您在GetName
和GetNamePtr
定义中缺少which
参数。实际代码中也一样吗?
@Naveen hi,很抱歉这个错误。我已经编辑了它,请评论
如果您提供一些有关错误的信息(带有错误的行)以及您想要的结果是什么?
在函数const Name& Interest::GetName (unsigned which) const
如果which >= 2
会返回什么?什么都没有?
为什么 GetName() 在您的标头中返回 void 而在您的源中返回 const Name&?
【参考方案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>(...)
。
嗯,就我而言,这或多或少是检索数组内容的正确方法:) 如果有些东西太复杂,我会尽量让它更容易理解。 有什么问题欢迎提问!
【讨论】:
【参考方案2】:错误出现在 Python 绑定代码的编译时。所以,
如果您自己编写了绑定(包装器)代码(使用 Python C API 或 boost::python),您必须找到定义 SetName 绑定的位置,它缺少一个参数。
1234563在那个定义中。您添加到帖子中的 Python 代码 setattr 清楚地表明 self._interest.SetName(obj) 调用是错误的:您的 C++ 显示 SetName 采用两个参数。如果 setattr 是由某个工具(ns3?)生成的,您必须找到它是如何做到的,以便给它正确的 SetName 定义,以便 setattr 有正确的调用。
【讨论】:
以上是关于python编译错误(绑定c++)的主要内容,如果未能解决你的问题,请参考以下文章