2

我试着这样做:

this->Label1->Text = "blah blah: " + GetSomething();

whereGetSomething()是一个返回字符串的函数。

编译器给了我一个错误:

“错误 C2679:二进制‘+’:未找到采用‘std::string’类型的右手操作数的运算符(或没有可接受的转换)”

string GetSomething()
{
    int id = 0;
    string Blah[] = {"test", "fasf", "hhcb"};

    return Blah[id];
}
4

2 回答 2

5

问题是您在这里至少有两个不同的字符串类在起作用。

WinForms(您显然正在将其用于您的 GUI)在任何地方都使用.NETSystem::String。所以该Label.Text属性正在获取/设置一个 .NETSystem::String对象。

您在问题中说该GetSomething()方法返回一个std::string对象。该类std::string基本上是 C++ 的内置字符串类型,作为标准库的一部分提供。

这两个类都很好并且很好地服务于它们各自的目的,但它们并不直接兼容。这就是(第二次尝试的)编译器消息试图告诉您的内容:

错误 C2664: void System::Windows::Forms::Control::Text::set(System::String ^): 无法将参数 1 从转换std::basic_string<_Elem,_Traits,_Ax>System::String ^

用简单的英语重写:

错误 C2664:无法将std::string作为参数 1 传递的本机对象转换为属性System::String所需的托管对象Control::Text

事实是,你真的不应该混合这两种字符串类型。因为 WinForms 本质上是强制你使用它的字符串类型,所以我会标准化它,至少对于与 GUI 交互的任何代码。所以如果可能的话,重写GetSomething()方法返回一个System::String对象;例如:

using namespace System;

...

String^ GetSomething()
{
    int id = 0;
    array <String^>^ Blah = gcnew array<String^>{"test", "fasf", "hhcb"};
    return Blah[id];
}

...

// use the return value of GetSomething() directly because the types match
this->Label1->Text = "blah blah: " + GetSomething();

如果这是不可能的(例如,如果这是与您的 GUI 几乎没有关系的库代码),那么您需要将一种字符串类型显式转换为另一种

#include <string>  // required to use std::string

...

std::string GetSomething()
{
    int id = 0;
    std::string Blah[] = {"test", "fasf", "hhcb"};
    return Blah[id];
}

...

// first convert the return value of GetSomething() to a matching type...
String^ something = gcnew String(GetSomething().c_str());

// ...then use it
this->label1->Text = "blah blah: " + something;
于 2013-07-06T09:46:00.990 回答
0

免责声明:我不是C++/CLI 向导。

我相信你正在寻找这样的东西:

String^ GetSomething()
{
    Int32 id = 0;
    array <String^>^ Blah = gcnew array<String^>{"test", "fasf", "hhcb"};
    return Blah[id];
}

您正在尝试混合使用 CLI 和非 CLI 代码。Windows 窗体使用 CLI。不要使用std::string. 而是使用System::String(我的代码假定您using namespace System在代码的顶部有。您还会注意到我已替换intSystem::Int32托管等效项。

您的其余代码都很好。我已将调用放在GetSomething()按钮的回调中:

private:
System::Void Button1_Click(System::Object^  sender, System::EventArgs^  e) 
{
    this->Label1->Text = "blah blah: " + GetSomething();
}
于 2013-07-06T04:42:00.910 回答