Problem mit Template

Cromon

Erfahrenes Mitglied
Hallo zusammen!

Ich habe hier ein Problem mit einem template bei dem ich irgendwie nicht auf einen grünen Zweig komme:
Code:
template<typename P1, class T = EmptyClassStub>
class ActionP1
{
	typedef void (T::*tFunc)(P1);

Diese Linie mit dem typedef verursacht faszinierende 9 Fehler. Wobei vermutlich nur einer relevant ist und die anderen davon "ableiten":
Code:
1>c:\users\admin\documents\visual studio 2010\projects\vazyr\vazyr\event.h(105): error C2825: 'T': must be a class or namespace when followed by '::'

Wo ist das Problem? Folgendes geht problemlos:
Code:
template<class T, typename P1>
class ActionP1
{
	typedef void (T::*tFunc)(P1);

Folgendes geht nicht:
Code:
template<typename P1, class T>
class ActionP1
{
	typedef void (T::*tFunc)(P1);

Was ist die Logik dahinter?

Gruss
Cromon
 
Hallo,

bei Problemen mit Templates bitte immer auch die Instanziierung des Templates mit angeben, die den Fehler verursacht. Folgender Quellcode wird von g++ 4.4.3 und Visual Studio 2008 problemlos kompiliert:
C++:
class EmptyClassStub {};

template<typename P1, class T = EmptyClassStub>
class ActionP1 {
  typedef void (T::*tFunc)(P1);
};

int main() {
  ActionP1<int> a;
  return 0;
}
Tritt der Fehler bei dir unter Visual Studio 2010 auch bei diesem Quellcode auf? Wenn nicht, gib bitte ein vollständiges Minimalbeispiel an.

Grüße,
Matthias
 
Zuletzt bearbeitet:
Hallo!

Das Problem hat sich jetzt gerade bei der Suche nach allen Instanzierungen erledigt, ich habe da eine Kleinigkeit übersehen. Das jetzt korrekte
Code:
EventP1<ActionP1<HDC>, HDC> OnPaint;

War vorhin noch ActionP1<CBasicWindow, HDC>, daher der Fehler. Ich hab immer bei der eigentlichen Instanzierung geschaut in welcher dem OnPaint-Event eben ein ActionP1 hinzugefügt wurde und vergessen zus chauen, ob das vielleicht noch andersweitig auftritt.

Gruss
Cromon
 
Zurück