.NET Widows Form Anwendung als C++ Projekt mit STL Unterstützung?



  • Hallo Leute,

    ist es schon jemandem gelungen die generischen Klassen aus der STL unter .NET zu benutzen?

    Ich besitze VStudio .Net prof 2003 und habe ein .NET Windows Form Anwendung
    als C++ Projekt erstellt.

    Soweit alles OK, ich kann die Sprachelemente von C++ nutzen und greife auf die komfortable Bibliothek von .NET.
    Ich kann sogar Ansi C/C++ Funktionen wie strcpy anwenden.

    An dieser Stelle wollte ich etwas weiter experimentieren und z.Bsp den vector aus der STL benutzen.

    Dies scheitert aber mit der Fehlermeldung "nichtdeklarierter Bezeichner",
    obwohl die Intellisense die Methoden etc. erkennt?

    Ist es grundsätzlich nicht möglich die STL unter .NET zu benutzen ?

    Dies wäre nämlich auch einer der Gründe weshalb ich auf C# nicht umsteigen möchte.

    Für freundliche Hinweise wäre ich dankbar

    epidemic



  • epidemic schrieb:

    Hallo Leute,

    ist es schon jemandem gelungen die generischen Klassen aus der STL unter .NET zu benutzen?

    ja

    epidemic schrieb:

    Dies scheitert aber mit der Fehlermeldung "nichtdeklarierter Bezeichner",
    obwohl die Intellisense die Methoden etc. erkennt?

    hast du auch die <vector> includiert? bzw. den namespace std verwendet?

    epidemic schrieb:

    Ist es grundsätzlich nicht möglich die STL unter .NET zu benutzen ?

    ja aber nur wenn du ein "managed extensions for c++" projekt erstellst

    epidemic schrieb:

    Dies wäre nämlich auch einer der Gründe weshalb ich auf C# nicht umsteigen möchte.

    was willst du jetzt machen? C# oder managed c++? mit c# geht es natürlich nicht, weil man mit c# bis jetzt noch keine template klassen erstellen/verwenden kann.

    Grüße 😮



  • Sorry, habe mich bei den hochkommatas verhauen.
    Das lertzte Post nach Möglichkeit löschen. [Edit]Done, AndreasW[/Edit]
    Danke!

    red2k schrieb:

    ja

    Sorry, aber "ja" hilft mir wenig, etwas konkreter wäre schon hilfreicher...

    red2k schrieb:

    hast du auch die <vector> includiert? bzw. den namespace std verwendet?

    Natürlich beides gemacht

    red2k schrieb:

    ja aber nur wenn du ein "managed extensions for c++" projekt erstellst

    Diese Projektart ".NET Widows Form Anwendung als C++ Projekt" ist bereits
    so oder so managed C++

    red2k schrieb:

    was willst du jetzt machen? C# oder managed c++? mit c# geht es natürlich nicht, weil man mit c# bis jetzt noch keine template klassen erstellen/verwenden kann.

    natürlich C++ , es geht aber aus meinem Post hervor

    Grüße, mit der Hoffnung auf eine hilfreiche Antwort!

    epidemic



  • dann poste mal den codeauschnitt indem es nicht klappt.



  • Es gibt eigentlich kein Beispiel,

    Einfach:
    Datei/Neu/Projekt/Visual C++ Projekte/.NET/Widows Forms Anwendung

    //Dann per
    #include <vector> //die Vectorklasse includieren
    //und , namespace setzen
    using namespace std;

    //und dann versuch einen vector zu deklarieren z Bsp:
    vector<int> zahl;

    //Beim Kompilieren folgende Fehlermeldung
    c:\work\c++\VC++ NET\Templates\ff\Form1.h(107) : error C2065: 'vector': nichtdeklarierter Bezeichner
    c:\work\c++\VC++ NET\Templates\ff\Form1.h(107) : error C2062: 'int'-Typ unerwartet



  • hier meine code. dieser funktioniert bei mir. wenn du willst kann ich dir das projekt auch per email schicken
    Form1.h

    #pragma once
    
    #include <vector>
    namespace STLTest
    {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace std;
    
    	/// <summary> 
    	/// Summary for Form1
    	///
    	/// WARNING: If you change the name of this class, you will need to change the 
    	///          'Resource File Name' property for the managed resource compiler tool 
    	///          associated with all .resx files this class depends on.  Otherwise,
    	///          the designers will not be able to interact properly with localized
    	///          resources associated with this form.
    	/// </summary>
    	public __gc class Form1 : public System::Windows::Forms::Form
    	{	
    
    	public:
    
    		Form1(void)
    		{
    			t2 = new vector<string>;
    			t2->push_back("test");
    			t2->push_back("test2");
    			InitializeComponent();
    		}
    
    	protected:
    		void Dispose(Boolean disposing)
    		{
    			if (disposing && components)
    			{
    				components->Dispose();
    			}
    			__super::Dispose(disposing);
    		}
    
    	private: System::Windows::Forms::Button *  button1;
    
    	private:
    		/// <summary>
    		/// Required designer variable.
    		/// </summary>
    		System::ComponentModel::Container * components;
    
    		/// <summary>
    		/// Required method for Designer support - do not modify
    		/// the contents of this method with the code editor.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			this->button1 = new System::Windows::Forms::Button();
    			this->SuspendLayout();
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(112, 112);
    			this->button1->Name = S"button1";
    			this->button1->TabIndex = 0;
    			this->button1->Text = S"button1";
    			this->button1->Click += new System::EventHandler(this, button1_Click);
    			// 
    			// Form1
    			// 
    			this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
    			this->ClientSize = System::Drawing::Size(292, 273);
    			this->Controls->Add(this->button1);
    			this->Name = S"Form1";
    			this->Text = S"Form1";
    			this->Load += new System::EventHandler(this, Form1_Load);
    			this->Closed += new System::EventHandler(this, Form1_Closed);
    			this->ResumeLayout(false);
    
    		}	
    	private: System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
    			 {
    			 }
    
    	private: System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)
    			 {
    				 for (vector<string>::iterator it = t2->begin(); it != t2->end(); it++)
    				 {
    					 string tmp = *it;
    					 MessageBox::Show(tmp.c_str());
    				}
    			 }
    
    	public:
    		vector<string>* t2;
    	private: System::Void Form1_Closed(System::Object *  sender, System::EventArgs *  e)
    			 {
    				 delete t2;
    			 }
    
    	};
    }
    

    Anmerkungen: man kann in der managed Form1 nur einen pointer zum vector als member variable definieren, da std::vector einen copy constructor hat.

    Grüße 😮



  • Hi red2k,

    Vielen Dank für Deine Mühe!!!

    könntest Du mir das Projekt an diese mail adresse senden?
    thomas.orlowski@cplusplus-gate.de

    Danke und Grüße

    epidemic


Anmelden zum Antworten