尝试在托管的.dll中包装一些非托管代码时,我正在尝试将Generic::List
个数据点转换为std::vector
。这是我正在尝试做的一小部分:
namespace ManagedDLL
{
public ref class CppClass
{
void ListToStdVec( const List<double>& input_list, std::vector<double>& output_vector )
{
// Copy the contents of the input list into the vector
// ...
}
void ProcessData( List<double> sampleData )
{
std::vector<double> myVec;
ListToStdVec( sampleData, myVec );
// Now call the unmanaged code with the new vector
// ...
}
}
}
编译这个给了我:
错误C3699:'&amp;' :不能在类型'const System :: Collections :: Generic :: List'
上使用此间接
我可能错过了一些基本的东西(我对.net的做事方式相对较新),但这对我来说看起来是合理有效的代码..?
[编辑] 我已经尝试了Andy和Dario的建议并且它们有效,但我如何访问输入列表的成员?我尝试过各种各样的dreferencing组合,似乎没有编译:
void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector )
{
int num_of_elements = input_list->Count;
}
void ListToStdVec( const List<double>^ input_list, std::vector<double>& output_vector )
{
int num_of_elements = input_list.Count;
}
...都给我:
错误C2662:'System :: Collections :: Generic :: List :: Count :: get':无法将'this'指针从'const System :: Collections :: Generic :: List'转换为'System :: Collections :: Generic :: List%'
...那么如何访问引用/指针?
答案 0 :(得分:2)
根据Herb Sutter,%
是托管对象按引用字符传递。将代码转换为以下代码,它应该可以工作:
void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector
{
// Copy the contents of the input list into the vector
// ...
}
修改:我认为const
导致问题,但我不确定原因。如果将List
参数更改为const
,则在使用->
运算符时将编译第一个函数,而如果使用.
则第二个函数将编译运算符(我不确定为什么存在这种差异 - 它没有多大意义)。
也就是说,如果你要做的就是将List
中的元素复制到vector
,那么你真的想要使用^
。可以将其视为具有对托管对象的引用。我认为,如果您想通过“引用”传递引用,则会使用%
(即将input_list
重新分配给ListToStdVec()
中的其他内容,并让调用方查看该分配的结果但是,鉴于您在使用.
时使用%
运算符访问成员,这告诉我可能根本不理解其目的。
答案 1 :(得分:1)
由于List<T>
是一个托管的.NET类,它由^表示的托管GC-Handle传递,而不是由C ++表示 - 引用。
例如:
void ListToVec(List<double>^ input_list, std::vector<double>& out)
此处您不需要额外的const
。符号List<T>^%
创建跟踪引用(与C ++ - 指针相当),而不是通过引用调用。
只需按list->...
和list[...]
访问成员。