C++ cli c++;cli跟踪引用错误

C++ cli c++;cli跟踪引用错误,c++-cli,tracking-reference,C++ Cli,Tracking Reference,我似乎无法理解在代码中定义跟踪引用时遇到的以下错误 List<MyClass^>^ myClassList = nullptr; DoWork(myClassList); List^myClassList=nullptr; DoWork(我的类列表); 函数签名为: void DoWork([Out] gcroot<List<MyClass^>^> %myClassList); void DoWork([Out]gcroot%myClassList);

我似乎无法理解在代码中定义跟踪引用时遇到的以下错误

List<MyClass^>^ myClassList =  nullptr;
DoWork(myClassList);
List^myClassList=nullptr;
DoWork(我的类列表);
函数签名为:

void DoWork([Out] gcroot<List<MyClass^>^> %myClassList);
void DoWork([Out]gcroot%myClassList);
我的编译错误是:

(很抱歉屏幕截图。SOF不能很好地处理错误字符串中的字符)

如果我从签名中删除跟踪引用(删除“%”字符),则效果良好


任何想法?< /P> GCROOT是一个本地C++模板,它的目的是允许一个本地C++类型存储对被管理对象的引用。它封装了<代码> ItpTrt/Cuth>,作为本地C++类的成员。编译器会抱怨,因为通过引用传递它需要&,而不是%。但实际上,您根本不应该使用gcroot作为参数,DoWork()必须是托管代码才能创建列表对象。因此,您需要将参数类型更改为

List^%
。但是,由于代码片段表明调用方不会传递非空的List对象,因此您更喜欢
List^DoWork()
@HansPassant我完全同意不使用gcroot是正确的做法。然而,这是我们代码中的一个约束,因为我们的类是uu declspec(dllexport)。在这种情况下,我们必须在所有托管函数中使用gcroot:(这对于允许本机代码直接调用托管方法非常有用。但此类本机代码不知道gcroot是什么样子,也不知道.NET泛型如何工作。它只是无法进行调用。您必须使用此类代码可以理解的集合类型,如简单数组或std::vector。使用vector非常危险,因为o C++库版本依赖项,所以你需要一个基本的C数组。需要增加一个参数来传递大小。也许你应该对你所暴露的东西有点选择性。