C++/CLI C2061 Bezeichner 'Bezeichner' Fehler ..

Hallo liebe Community,

Ich habe ein kleines Problem in C++, welches ich nicht ganz verstehe und auch noch nie hatte..
Es ist der C2061 Compilerfehler "Syntaxfehler: Bezeichner 'Bezeichner'";

Ich versuche gerade ein wenig mit SDL in C# zu arbeiten, will mir deshalb SDL nach meinen Bedürfnissen wrappen. Ich hatte vor einem halben Jahr schon mal SDL gewrappt, jedoch ist mein Pc im Eimer und alle Daten mit.

Folgenden Code habe ich:

SDL.NET.h
C++:
#pragma once

using namespace System;

#include <SDL.h>

namespace SDL
{
	namespace Net
	{
		ref class SDL sealed 
		{
			private:
				SDL(void);
			public:
				bool Initialize(InitOptions);
		};

		enum struct InitOptions
		{
			Audio = SDL_INIT_AUDIO,
			CDROM = SDL_INIT_CDROM,
			EventThread = SDL_INIT_EVENTTHREAD,
			Everything = SDL_INIT_EVERYTHING,
			Joystick = SDL_INIT_JOYSTICK,
			NoParachute = SDL_INIT_NOPARACHUTE,
			Timer = SDL_INIT_TIMER,
			Video = SDL_INIT_VIDEO
		};
	}
}

Der Fehler:
Code:
error C2061: Syntaxfehler: Bezeichner 'InitOptions'

Ich habe schon gegooglet und auch einige Themen gefunden, jedoch hat nichts wirklich mein Problem behoben..

Wenn ihr mir helfen könntet, wäre es sehr nett, und wenn ihr mehr Informationen braucht, dann fragt einfach :)

Danke im Voraus.

PS: Bitte keine Programmiertipps geben, mir geht es hier NUR um diesen Fehler, danke..

mfg
JustShinigami
 

Cromon

Erfahrenes Mitglied
Hallo JustShinigami

Es heisst enum class, nicht enum struct.

PS:
Eine der Kernfähigkeiten eines Programmierers sollte es sein offen für Vorschläge und Verbesserungen zu sein. Dazu gehören auch Programmiertipps.

Viele Grüsse
Cromon
 
Vielen dank für die Antwort, mache mich jedoch jetzt auf den Weg in den Urlaub, sprich ich werde es erst in 2 wochen testen können.

PS: Sicherlich gehört das Lernen durch Aneignung von fremdem Wissen zu den Kernfähigkeiten, yedoch irririeren mich Tipps, die nichts mit dem Fehler zu tun haben bei der Problembehebung. Ich hoffe, es wird nicht falsch aufgefasst, ich bin offen für neues, besseres, aber nicht, wenn es mich blockiert. :)

mfg
JustShinigami
 
So, erstmal entschuldigung für den Doppelpost, will damit nur zeigen, dass das Thema wieder aktuell ist, weil ich wieder da bin.
Ich habe einen Weg gefunden, den Fehler bei meinem Problem zu umgehen, auch wenn ich kein Fan von Umgehung bin.

Jetzt steh ich wieder vor dem nächsten Problem, wieder das selbe.

Folgenden Code besitze ich:

SDL.NET.h
C++:
#pragma once

using namespace System;

#include <SDL.h>

typedef unsigned int uint;
typedef unsigned char byte;

namespace SDL
{
	namespace Net
	{
		public ref class SDL abstract sealed 
		{
			private:

			public:
				static bool Initialize(UInt32);
		};

		public ref class Texture
		{
			private:
				Texture(void);

			internal:
				SDL_Surface* _texture;

			public:
				property uint Flags
				{
					uint get()
					{
						return this->_texture->flags;
					};
				};
		};

		public value class PixelFormat
		{
			internal:
				SDL_PixelFormat* _format;

			public:

		};

		public value class Palette
		{
			internal:
				SDL_Palette* _palette;

			public:
				property int Count
				{
					int get()
					{
						return this->_palette->ncolors;
					};
				};

				property array<Color^>^ Colors
				{
					array<Color^>^ get()
					{
						array<Color^>^ Temp = gcnew array<Color^>(this->Count);
						for (int Index = 0; Index < this->Count; Index++)
							Temp[Index] = gcnew Color(this->_palette->colors[Index]);
						return Temp;
					}
				};
		};

		public value class Color
		{
			internal:
				SDL_Color* _color;
				Color(SDL_Color*);

			public:
				property byte Red
				{
					byte get()
					{
						return this->_color->r;
					};
				};

				property byte Green
				{
					byte get()
					{
						return this->_color->g;
					};
				};

				property byte Blue
				{
					byte get()
					{
						return this->_color->b;
					};
				};

				property byte Alpha
				{
					byte get()
					{
						return this->_color->unused;
					};
				};
		};

		[Flags]
		public enum class SubSystems : uint
		{
			Audio = SDL_INIT_AUDIO,
			CDROM = SDL_INIT_CDROM,
			EventThread = SDL_INIT_EVENTTHREAD,
			Everything = SDL_INIT_EVERYTHING,
			Joystick = SDL_INIT_JOYSTICK,
			NoParachute = SDL_INIT_NOPARACHUTE,
			Timer = SDL_INIT_TIMER,
			Video = SDL_INIT_VIDEO
		};

		[Flags]
		public enum class SurfaceFlags : uint
		{
			Alpha = SDL_SRCALPHA,
			AnyFormat = SDL_ANYFORMAT,
			AsyncBlit = SDL_ASYNCBLIT,
			ColorKey = SDL_SRCCOLORKEY,
			DoubleBuffered = SDL_DOUBLEBUF,
			ExclusivePalette = SDL_HWPALETTE,
			Fullscreen = SDL_FULLSCREEN,
			HardwareAccel = SDL_HWACCEL,
			HardwareSurface = SDL_HWSURFACE,
			OpenGL = SDL_OPENGL,
			OpenGLBlit = SDL_OPENGLBLIT,
			Preallocation = SDL_PREALLOC,
			Resizeable = SDL_RESIZABLE,
			RLEAccel = SDL_RLEACCEL,
			SystemSurface = SDL_SWSURFACE
		};
	};
};
SDL.NET.cpp
C++:
#include "SDL.NET.h"
#include <SDL.h>

bool SDL::Net::SDL::Initialize(UInt32 Options)
{
	return SDL_Init(Options) != -1;
};

SDL::Net::Texture::Texture(void)
{ };

SDL::Net::Color::Color(SDL_Color* Data)
{
	this->_color = Data;
};

Alles scheint zu passen, jedoch kommt nun wieder der selbe Fehler wie anfangs..
Code:
Fehler	1	error C2065: 'Color': nichtdeklarierter Bezeichner	c:\users\shinigami games\documents\visual studio 2012\projects\sdl.net\sdl.net\SDL.NET.h	63	1	SDL.NET

An dem "class" oder "struct" nach dem Datentyp gibt es keinen unterschied, laut msdn soll beides gehen. Woran könnte es noch liegen? Evtl an Visual Studio? Ich hatte dieses Problem nie, und ich hatte schon mal eine Wrapperbhibliothek für SDL geschrieben..

Ich freue mich über jede Überlegung.

mfg
JustShinigami
 

Cromon

Erfahrenes Mitglied
In Zeile 63 hast du:
C++:
 property array<Color^>^ Colors

In Zeile 75 hast du:
C++:
public value class Color

Mit anderen Worten: Du verwendest Color bevor du es deklarierst.

Ausserdem solltest du deine Klassen die ein unverwaltetes Objekt handeln wie Color oder Palette nicht als Valueklasse definieren da diese by value übergeben werden und somit ganz viele verschiedene Zeiger auf dein unverwaltetes Objekt entstehen. In deiner aktuellen Version hat das insofern keine direk bemerkbaren Auswirkungen da du keinen Destruktor hast der das Objekt wieder freigibt sondern das unverwaltete Objekt einfach in einem Memoryleak liegen lässt. Solltest du aber einen Destruktor einbauen (und das musst du, da du Aufräumarbeiten zu erledigen hast) würde das gleiche Objekt unzählige Male gelöscht werden, beim zweiten mal stürzt das Programm dann ab.
 
Ahaa, so langsam entsinne ich mich. Das klingt logisch.ich möchte meine Codeblöcke yetzt aber nicht permanent rumschieben, damit der Compiler von der Klasse weiß.. Kann ich die Datentypen vorher deklarieren?

Und du hast natürlich recht, das mit dem value class scheint wohl nicht so optimal zu sein. Dazu eine Frage: Da ich ya unverwalteten Code in meinen verwalteten Datentypen habe, ist da die IDisposable-Schnittstelle vorteilhaft oder kann man den unverwalteten Code auch via Destruktor oder einer eigenen Release()-Funktion freigeben? Wo und wann man IDisposable verwendet habe ich nämlich nie verstanden.

Soweit weiß ich nun, was der Fehler bedeutet und wie ich ihn (vorerst) beheben kann. Dafür ein großes Danke :)

EDIT:
Habe nun alles herausgefunden, was es dazu zu wissen gibt. Das Thema ist erledigt :)
Danke nochmal dafür.

mfg
JustShinigami
 
Zuletzt bearbeitet: