Я пытаюсь реализовать шаблон наблюдателя с помощью шаблона предметного класса. Наблюдатели не должны (должны) знать тип субъектов, поэтому я создал интерфейс для метода присоединения без этого типа. Это моя реализация:
SubjectInterface.h
#ifndef SUBJECTINTERFACE_H_
#define SUBJECTINTERFACE_H_
#include <list>
#include "Observer.h"
// Template-independant interface for registering observers
class SubjectInterface
{
public:
virtual void Attach(Observer*) = 0;
}; // class SubjectInterface
#endif // SUBJECTINTERFACE_H_
Subject.h
#ifndef SUBJECT_H_
#define SUBJECT_H_
#include <list>
#include "Observer.h"
#include "SubjectInterface.h"
template <class T>
class Subject : public SubjectInterface
{
public:
Subject();
~Subject();
void Attach(Observer*);
private:
T mValue;
std::list<Observer*> mObservers;
}; // class Subject
#include "Subject.cpp"
#endif // SUBJECT_H_
Subject.cpp
template <class T>
Subject<T>::Subject()
{
}
template <class T>
Subject<T>::~Subject()
{
}
template <class T>
void Subject<T>::Attach(Observer* test)
{
mObservers.push_back(test);
}
Observer.h
#ifndef OBSERVER_H_
#define OBSERVER_H_
#include "SubjectInterface.h"
#include <iostream>
class Observer
{
public:
Observer(SubjectInterface* Master);
virtual ~Observer();
private:
SubjectInterface* mMaster;
}; // class Observer
#endif // OBSERVER_H_
Observer.cpp
#include "Observer.h" // include header file
Observer::Observer(SubjectInterface* Master)
{
Master->Attach(this);
}
Observer::~Observer()
{
}
Когда я компилирую это с помощью gcc 4.3.4, я получаю следующее сообщение об ошибке:
SubjectInterface.h:10: error: ‘Observer’ has not been declared
Я не понимаю этого, потому что Наблюдатель включен только несколькими строками выше. Когда я меняю тип указателя с Observer * на int *, он компилируется. Я предполагаю, что есть проблема с темой шаблона и не шаблонным интерфейсом к нему, но это не то, что говорит мне gcc, и это не проблема при использовании int *.
Я искал шаблон / наблюдателя, но то, что я нашел (например, Реализация шаблона субъекта / наблюдателя с шаблонами ), не совсем то, что мне нужно.
Может кто-нибудь сказать мне, что я сделал не так или как я могу вызвать шаблонный метод attach от не шаблонного наблюдателя?