的問題是,你在遊戲中至少有兩個不同的字符串類在這裏
的WinForms(你正在使用顯然是爲您的GUI )使用.NET System::String
class無處不在。因此,Label.Text
屬性正在獲取/設置一個.NET System::String
對象。
你說在GetSomething()
方法返回一個std::string
對象的問題。 std::string
類基本上是C++的內置字符串類型,作爲標準庫的一部分提供。
這兩個類都很好,很好地服務於各自的目的,但它們不直接兼容。這是什麼(第二次嘗試的)編譯器的消息要告訴你:
error C2664: void System::Windows::Forms::Control::Text::set(System::String ^)
: cannot convert parameter 1 from std::basic_string<_Elem,_Traits,_Ax>
to System::String ^
用簡單的英語改寫:
error C2664: cannot convert the native std::string
object passed as parameter 1 to a managed System::String
object, required for the Control::Text
property
事實是,你真的不應該將兩者混合字符串類型。由於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),那麼你需要explicitly convert one string type to the other:
#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;
可以顯示GetSomething代碼? – billz
您是否#include? –
@RanEldan我只是這樣做,另一個錯誤出現:\t錯誤C2664:'System :: Windows :: Forms :: ToolStripItem :: Text :: set':無法將參數1從'std :: basic_string <_Elem,_Traits ,_Alloc>'到'System :: String ^' – Kyle