2016-08-08 3 views
0

У меня проблема с проектом с использованием наследования класса шаблона. Идея состоит в том, чтобы иметь агент, который имеет указатель на msgtype. msgtypes может отличаться, поэтому класс шаблонов входит в игру. Идея состоит в том, чтобы хранить разные типы сообщений через класс интерфейса. Чтобы инициализировать указатель интерфейса в агенте с экземпляром msgtype, мне нужно, чтобы включал #include "msginterface.h" и #include "msgtype.h". К сожалению, если я просто включаю «msginterface.h», проект компилируется просто отлично. Но если я добавлю #include "msgtype.h" в Agent.h, который мне нужен для инициализации. Я получаю эту ошибку с ума:Взаимодействие и Inheritage классов шаблонов в C++

Ошибки я получаю:

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

У вас есть идея, что причина этой ошибки?

Ошибка может быть воспроизведена с помощью следующего кода:

//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

Класс 'MsgInterface' не шаблонный класс, так почему вы пытаетесь использовать его как таковой? –

+1

Несвязанный с вашей проблемой, но символы (даже символы препроцессора, например, ваш макрос защиты заголовка '_AGENT'), начинающийся с подчеркивания, сопровождаемый другим подчеркиванием или строчной буквой, зарезервирован« реализацией »(компилятор и стандартная библиотека) во всех областях. См. [Этот вопрос и его ответы] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier) ​​для большей информации. –

ответ

0

Вы не объявили MsgInterface как шаблонный класс.

Попробуйте что-то вроде:

template<class Agent> 
class MsgInterface 
{ 
    Agent* agent; 
} 
Смежные вопросы