【问题标题】:C++/CLI : Why can't I pass Strings by reference?C++/CLI:为什么我不能通过引用传递字符串?
【发布时间】:2010-10-14 01:09:05
【问题描述】:

为什么微软的 C++/CLI 不允许我通过引用传递字符串?我收到以下错误:

C3699: '&': 不能在类型 'System::String' 上使用此间接寻址

【问题讨论】:

  • 我添加了 C++-cli 标签,因为它看起来就像你在这里使用的那样。
  • 仅作为参考:C++/CLI 不是 C++;尽管名称相似,但 c++ 和 c++-cli 标签非常接近互斥;关于一个(包括这个)的问题通常对另一个毫无意义。

标签: string reference c++-cli managed-c++


【解决方案1】:

首先,.NET 确实有两种特定于 Microsoft 的 C++ 方言:旧的“托管 C++”(Visual Studio 2002 和 2003)和 C++/CLI(Visual Studio 2005 和更高版本)。

在 C++/CLI 中,System::String^ 是对字符串的 .NET 引用;一些作者称其为“跟踪指针”,以将其与普通 C++ 指针进行比较和对比。与在 C++ 中一样,您可以“通过引用”传递 .NET 引用,但您可以使用&,而不是使用%,如下所示:

void makeStr(System::String^ %result) {
   result = gcnew System::String("abc");
}

【讨论】:

  • 我们是否明确需要删除从 C# 层传递的变量“result”,还是由 GC 负责删除?
  • 我认为 GC 会处理它的。
【解决方案2】:

听起来您正在使用 Managed C++,这是与 .NET Framework 一起使用的混蛋 C++。

在托管 C++ 中,我相信您正在寻找的语法是 System::String^。这样做的原因是,由于托管类型是由 .NET Framework 收集的垃圾,因此不允许创建“常规”引用,因为 GC 需要跟踪对特定变量的所有引用,以了解何时可以安全地释放它.

【讨论】:

【解决方案3】:

看起来您正在使用托管 C++。你应该改用System::String^。

【讨论】:

    猜你喜欢
    • 2014-08-11
    • 2017-07-25
    • 2016-07-05
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2018-09-01
    • 2010-12-24
    相关资源
    最近更新 更多