[VC++ 2008/CLI] unerklärlicher Compilierfehler C3083

20/08/2010 - 13:12 von Armin Zingler | Report spam
Hi,

ich bekomme stàndig einen Compilierfehler und behaupte mittlerweile, dass
das ein Compiler-Bug ist:

error C3083: "Test": Das Symbol links neben "::" muss ein Typ sein.

//Deklaration
namespace Test
{
public ref class CTest sealed abstract
{
public:
static void Method1(IntPtr ptr);
static IntPtr Method2();
};
}


//Implementierung
namespace Test
{
void ::Test::CTest::Method1(IntPtr ptr){};
IntPtr ::Test::CTest::Method2(){}; // < hier Fehler C3083
}

Ich weiß, dass in diesem Fall die Verwendung von "::Test" nicht erforderlich
ist, in der Praxis jedoch schon. Kann mir aber bitte jemand den Fehler
erklàren?? Der Typ 'IntPtr' ist definitiv bekannt, und außerdem wird die
Deklaration von Methode2 ja auch nicht angemeckert! Irgendwie meint der
Compiler, dass "::Test" ein Memberzugriff sein soll, aber da ist doch ein
Blank dazwischen (ja, ist es). Ist meine Syntax denn falsch?

Armin
 

Lesen sie die antworten

#1 Stefan Reuther
20/08/2010 - 15:15 | Warnen spam
Armin Zingler wrote:
ich bekomme stàndig einen Compilierfehler und behaupte mittlerweile, dass
das ein Compiler-Bug ist:

error C3083: "Test": Das Symbol links neben "::" muss ein Typ sein.


[...]
IntPtr ::Test::CTest::Method2(){}; // < hier Fehler C3083
}

Ich weiß, dass in diesem Fall die Verwendung von "::Test" nicht erforderlich
ist, in der Praxis jedoch schon. Kann mir aber bitte jemand den Fehler
erklàren?? Der Typ 'IntPtr' ist definitiv bekannt, und außerdem wird die
Deklaration von Methode2 ja auch nicht angemeckert! Irgendwie meint der
Compiler, dass "::Test" ein Memberzugriff sein soll, aber da ist doch ein
Blank dazwischen (ja, ist es). Ist meine Syntax denn falsch?



Blanks sind dem Compiler egal, der versucht das tatsàchlich als ein
Symbol 'IntPtr::Test::CTest::Method2' aufzulösen. Mit 'void' klappt das
deswegen, da 'void' nicht Teil eines Symbolnamens sein kann. Ein
möglicher Workaround ist, den Methodennamen zu klammern:
IntPtr (::Test::CTest::Method2)(){}

So ist es jedenfalls in C++, ich gehe mal davon aus, dass es in C++/CLI
genauso ist.


Stefan

Ähnliche fragen