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