2016-08-08 110 views
0

Ich habe ein Problem mit einem Projekt mit Vorlage Klassenvererbung. Die Idee ist, einen Agenten zu haben, der einen Zeiger auf einen msgtype hat. Die msgtypes können sich unterscheiden, deshalb kommt eine Template-Klasse ins Spiel. Die Idee ist, die verschiedenen Nachrichtentypen über eine Interface-Klasse zu speichern. Um den Schnittstellenzeiger in Agent mit einer Instanz von msgtype zu initialisieren, muss ich include #include "msginterface.h" und #include "msgtype.h". Leider, wenn ich nur "msginterface.h", das Projekt kompiliert einfach gut. Aber wenn ich #include "msgtype.h" in Agent.h hinzufügen, die ich für die Initialisierung benötige. Ich erhalte diese verrückten Fehler:Interfacing und Inheritage von Template-Klassen in C++

Der Fehler, den ich bekommen ist:

error: expected template-name before ‘<’ token class Msg:public MsgInterface{ ^/home/Catkin/src/template_class/src/msg.h:10:30: error: expected ‘{’ before ‘<’ token /home/Catkin/src/template_class/src/msg.h:10:30: error: expected unqualified-id before ‘<’ token

Haben Sie eine Ahnung, was der Grund für diesen Fehler ist?

kann der Fehler mit dem folgenden Code wiedergegeben werden:

//main.cpp

#include <stdio.h> 
#include <iostream> 
#include <agent.h> 
using namespace std; 

int main(void){ 
cout<<"Hello world"<<endl; 
} 

//agent.h

#ifndef _AGENT 
#define _AGENT 
#include "msginterface.h" 
#include "msgtype.h" 

class Agent{ 
MsgInterface* msg; 
}; 
#endif 

//msginterface.h

#ifndef _MSGINTERFACE 
#define _MSGINTERFACE 

#include <stdio.h> 
#include <agent.h> 
using namespace std; 

class Agent; //Forward Declaration 
class MsgInterface{ 
Agent* agent; 
}; 
#endif 

//msg.h

#ifndef _MSG 
#define _MSG 

#include <stdio.h> 
#include <agent.h> 
#include "msginterface.h" 
using namespace std; 

template <class T> 
class Msg:public MsgInterface<T>{ 
}; 
#endif 

//msgtype.h

#ifndef _MSGTYPE 
#define _MSGTYPE 
#include <stdio.h> 
#include "agent.h" 
#include "msg.h" 
using namespace std; 

template <class S> 
class MsgTape:public Msg<S>{ 
}; 
#endif 
+2

Die 'MsgInterface' Klasse ist kein Templat-Klasse, also warum versuchen Sie es als solche zu benutzen? –

+1

Nicht verwandt mit Ihrem Problem, aber Symbole (sogar Präprozessorsymbole wie zB Ihr '_AGENT' Header Guard-Makro), beginnend mit einem Unterstrich, gefolgt von einem weiteren Unterstrich oder einem Großbuchstaben, werden von der" Implementierung "(Compiler und Standardbibliothek) reserviert) in allen Bereichen. Siehe [diese Frage und ihre Antworten] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a--identifier) ​​für mehr Informationen. –

Antwort

0

Sie haben MsgInterface nicht als Templates deklariert.

Versuchen Sie so etwas wie:

template<class Agent> 
class MsgInterface 
{ 
    Agent* agent; 
}