2012-07-16 40 views
0

我正在使用示例http://www.codeproject.com/Articles/3267/Implementing-a-Subject-Observer-pattern-with-templ来实现模板化主题/观察者模式。然而,我看起来像继承不工作,或一个奇怪的演员恼人的编译错误。任何帮助都会很棒。在帖子的底部是引起问题的线路。C++模板化主题观察者继承/ Cast冲突

错误

FooManager.h: In member function 
    'ReturnEnum FooManager::AddBar(BarPtr)': 

Foo.h:150: error: no matching function for call to 
    'Bar::attach(FooManagerPtr)' 

Subject.h:23: note: candidates are: 
    void Subject<T>::attach(Observer<T>) [with T = boost::shared_ptr<Bar>] 

守则

types.h中

class Bar; 
typedef boost::shared_ptr<Bar> BarPtr; 

class FooManager; 
typedef boost::shared_ptr<FooManager> FooManagerPtr; 

Observer.h

#include "types.h" 
template <class T> 
class Observer 
{ 
    public: 
     Observer(){} 
     virtual ~Observer() {} 
     virtual void update(T subject) = 0; 
}; 

Subject.h

#include "types.h" 
template <class T> 
class Subject 
{ 
    private: 
     vector< Observer<T> > m_observers; 

    public: 
     Subject() {} 
     virtual ~Subject() {} 
     void attach(Observer<T> observer) 
     { 
      m_observers.push_back(observer); 
     } 

     void notify() 
     { 
      for(vector< Observer<T> >::iterator it = m_observers.begin(); it != m_observers.end(); ++it) 
      { 
       (*it)->update(static_cast<T>(this)); 
      } 
     } 
}; 

Bar.h

#include "types.h" 
class Bar    : public Subject<BarPtr> 
{ 
}; 

FooManager.h

#include "types.h" 
class FooManager    : public Observer<BarPtr> 
{ 
    public: 
     ReturnEnum AddBar(BarPtr pBar) 
     { 
      pBar->attach(FooManagerPtr(this, boost_null_deleter())); 
     } 
}; 
+0

您正在尝试发送一个'提振:: shared_ptr'此功能:'无效附加(Observer observer)',因为'FooManagerPtr'是'boost :: shared_ptr' – 2012-07-16 15:54:54

回答

1

取决于你想要达到的目标,你可以试着改变(警告,未经测试的代码!):

void attach(Observer<T> observer) 
    { 
     m_observers.push_back(observer); 
    } 

void attach(boost::shared_ptr<Observer<T>> observer) 
    { 
     m_observers.push_back(observer); 
    } 

vector< Observer<T> > m_observers; 

vector< boost::shared_ptr<Observer<T> > > m_observers; 
+0

现在进行测试 – pyInTheSky 2012-07-16 16:18:23

+0

也许您需要对代码进行一些其他修改。让我知道如果你设法让它工作,但是,你应该首先尝试了解'boost :: shared_ptr'的作用。 – 2012-07-16 16:20:49

+0

成功,非常感谢:) – pyInTheSky 2012-07-16 16:37:48

1

pBarBar实例,因此attach()预计Observer<BarPtr>,而你通过shared_ptr<Observer<BarPtr> >

(顺便说一句,如果你已经使用升压,难道你会更好用Boost.Signals2?)

+0

从来不知道。我可以给它一个镜头,因为它看起来相当简单,特别是对于提升。 – pyInTheSky 2012-07-16 16:17:29

+2

@pyInTheSky它非常易于使用,线程安全,并允许您通过weak_ptr 轻松跟踪观察者。 – 2012-07-16 16:30:41

+0

最好的答案是Mihai提供解决问题的实际解决方案,尽管我很可能会使用这些信号,因为它看起来是一个更清洁的实现,所以+1和谢谢你 – pyInTheSky 2012-07-16 16:39:00