C2275 - System: String in Funktion

Alfons2

Mitglied
Moinsen,

wie kann man System::String an eine System::String^ Funktion() übergeben?
Also z.B
Code:
Funktion(System::String ^string1, System::String^ string2)

Aber der Compiler sagte mir:
Form1.h(249) : error C2275: 'System::String': Ungültige Verwendung dieses Typs als Ausdruck

Was mache ich falsch, bzw. wie geht es richtig? Wenn ich den "alten" std::string übergebe, meckert er an der anderen Seite, das er std::string nicht in System::String beim zurückgeben konvertieren kann

error C2440: 'return': 'std::string *' kann nicht in 'System::String ^' konvertiert werden
1> Es ist kein benutzerdefinierter Konvertierungsoperator verfügbar, oder
1> Ein nicht verwalteter Typ kann nicht in einen verwalteten Typ umgewandelt werden
 
Wenn ich bei dem Funktionsaufruf ^ durch * ersetze, kommt die selbe Fehlermeldung, wenn ich es bei der Funktionsdefinierung mache, sagt er, das er gerne ein ^ möchte.
 
Kanns sein das dein Rückgabewert nicht String^ ist?
Das es an den Parametern liegt würde ich jetzt erstmal verneinen.
 
Hm, also irgendwie nicht aber ich blicke auch nicht mehr so direkt durch, ich poste mal die Funktion und den Aufruf:


Die Funktion;
Code:
System::String^ dateiladen(System::String ^filepath)
{


System::IO::StreamReader ^streamreader = gcnew System::IO::StreamReader(filepath);


System::String ^pFile = streamreader->ReadToEnd();
			 

streamreader->Close();

return *pFile;
}


Der Funktionsaufruf:
Code:
myclass::dateiladen(System::String ^filepath);


und die Deklaration von filepath, die an die Funktion übergeben wird:
Code:
System::String ^filepath = open_dlg->FileName;

Nun ist alles da was mit der Funktion in Verbindung ist
 
Du musst den Typ deiner Variabeln nicht weiter erwähnen. Dieser wird nur zur Deklaration verwendet. Nacher hast du ihr ja einen Namen zugewiesen, den du dann verwenden kannst bzw musst.
 
Ohne den Stern bei return pFile habe ich schon probiert, ich habe den erst hin gemacht, als oben geschrieben wurde:
Kanns sein das dein Rückgabewert nicht String^ ist? Das es an den Parametern liegt würde ich jetzt erstmal verneinen.

Ich habe es so verstanden, das ich dort ein return ^pFile; hinschreiben muss, aber weil der dann meckerte beim compilen, ich solle ^ durch * austauschen tat ich das

Cromon hat gesagt.:
Du musst den Typ deiner Variabeln nicht weiter erwähnen. Dieser wird nur zur Deklaration verwendet. Nacher hast du ihr ja einen Namen zugewiesen, den du dann verwenden kannst bzw musst.
meinst du, ich soll einfach nur den Namen der Variable an die Funktion übergeben?
 
Selbstverständlich, hast du das schon jemals anders gemacht?

Zum Rückgabewert:
System::String ist ein verwalteter Typ. Daher können auch nur verwaltete Zeiger (In CLI/C++ durch ^ gekennzeichnet) verwendet werden mit diesen Typen. Ausserdem dürfen diese Zeiger nur unter speziellen Umständen dereferenziert werden um sicherzustellen, dass die GC den Speicher auch fehlerfrei verwalten kann.

Im Gegensatz dazu ist std::string ein nativer unverwalteter Typ aus C++. Daher kann dieser Typ auch nicht mit dem Symbol ^ verwendet werden und ist nicht kompatibel mit dem verwalteten String, da das wiederum Leaks erzeugen könnte. Zum Umwandeln ist Marshalling nötig.

Code:
System::String^ MyFunc(System::String^ pParam)
{
       System::String^ pRet = gcnew System::String("Parameter: ");
       pRet += pParam;
       return pRet;
}

Und ein Aufruf:
Code:
System::String^ file = "Meine Datei";
System::String^ ret = MyFunc(file);
std::string szOld;
szOld = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(ret).ToPointer();

PS: Der Code ist auf dem iPhone aus dem Kopf getippt, daher Schreibfehler vorbehalten ;)
 
Klasse, danke dir es funktioniert!

EDIT:

Ah moment eine Frage hätte ich diesbezüglich noch, kann man auch die Methoden der Form1 Klasse z..B. auf int, char, oder System::String setzen?

Code:
System::Void openToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e)
also das man dann unten hin return abc; schreiben kann? Wenn man das macht, dann gibt es ne Fehlermeldung
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück