【问题标题】:How to pass a vector as parameter to a c++ library from a CLI/C++ Wrapper?如何将向量作为参数从 CLI/C++ Wrapper 传递给 C++ 库?
【发布时间】:2016-01-12 17:45:27
【问题描述】:

我发现了类似的问题,但没有一个适合我的情况,所以我问自己的问题。

我想使用一个库函数,它接受一个指向 std::vector 的指针,并用数据填充它。

我已经设置了 C++/CLI Wrapper。 我目前正在尝试在包装器中实例化向量,

private:
   std::vector<int>* outputVector

在构造函数中,我将其实例化:

outputVector = new std::vector<int>();

现在,在调用 c++ 库函数的包装方法中:

m_pUnmanagedTPRTreeClass->GetInRegion(..., &outputVector)

我省略了其他参数,因为它们对这种情况无关紧要。我已经可以使用该库的其他功能,并且它们可以正常工作。我只是无法将指针传递给 std::vector。

使用这样的代码,我收到错误消息:

error C2664: 'TPSimpleRTree<CT,T>::GetInRegion' : cannot convert parameter 3 from 'cli::interior_ptr<Type>' to 'std::vector<_Ty> &' 

我已经尝试删除“&”,因为我不擅长 C++ 并且不确定如何正确使用指针。那么,错误就变成了:

error C2664: 'TPSimpleRTree<CT,T>::GetInRegion' : cannot convert parameter 3 from 'std::vector<_Ty> *' to 'std::vector<_Ty> &'  

编辑:我尝试用“*”替换“&”,它不起作用,我收到错误:

无法从 'std::vector<_ty>' 转换为 'std::vector<_ty> &'

向量的c++函数的签名是这样的:

GetInRegion(..., std::vector<T*>& a_objects)

【问题讨论】:

  • 您真的是要传递指针的地址而不仅仅是指针吗? GetInRegion 的签名是什么?请发帖Minimal, Complete, Verifiable example
  • 您根本不需要 new 向量,只需在函数调用中使用之前声明它,传递(非指针)向量的地址,然后将数据编组到.Net 函数调用后的集合。
  • ...从头开始! GetInRegionT* 中的vector 进行引用,所以你已经把它全部倒过来了。

标签: vector c++-cli wrapper unmanaged mixed-mode


【解决方案1】:

给定签名:

GetInRegion(..., std::vector<T*>& a_objects)

你可以这样称呼它(在 C++ 或 C++/CLI 中):

std::vector<int*> v;
m_pUnmanagedTPRTreeClass->GetInRegion(..., v);

然后您可以根据需要操作数据或将数据编组到 .Net 容器中。

【讨论】:

  • 非常感谢, 隐藏在库中的 typedef 下,我从未注意到它的含义。这解决了它!
  • 你好,再次崩溃,我想给你发个 PM,但我不知道怎么做,我无法将我的 std::vector 转换为可供以下用户使用的类型托管 C#。我的麻烦来自 部分,当我尝试使用 List^ 或 array 时,它不会让我转换。你能给我一些指示吗?
  • 假设int * 只是一个指向int 的指针,取消引用并保存int?对接口一无所知,所以不知道怎么用。
【解决方案2】:

'std::vector<_ty> *' 到 'std::vector<_ty> &'

是不言自明的,您需要取消引用而不是使用指针,所以而不是:

 m_pUnmanagedTPRTreeClass->GetInRegion(..., &outputVector)

使用:

 m_pUnmanagedTPRTreeClass->GetInRegion(..., *outputVector)
                                            ^~~~~~~!! 

在您编辑后,我看到您的 getinregion 签名是:

 GetInRegion(..., std::vector<T*>& a_objects)

所以它接受 std::vector ,其中 T 是一个指针,而你想传递给 getinregion 一个 std::vector ,其中 int 不是指针。

【讨论】:

  • 您好,很抱歉忽略了这一点,但我已经尝试了您的建议。我得到了同样的错误,除了它:'std::vector<_ty>' to 'std::vector<_ty> &'
  • @Storm 看到我的编辑,我承认我不知道 CLI 在这里可能会导致多远的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2020-12-26
  • 2021-09-23
  • 1970-01-01
  • 2014-11-09
  • 2011-12-02
  • 2013-08-10
相关资源
最近更新 更多