C++ 模板化主题观察者继承/转换冲突

标签 c++ templates inheritance shared-ptr

我正在使用示例 http://www.codeproject.com/Articles/3267/Implementing-a-Subject-Observer-pattern-with-templ实现模板化的主题/观察者模式。但是,我遇到了烦人的编译错误,看起来像继承不起作用,或者是一个奇怪的转换。任何帮助都会很棒。帖子底部是导致问题的行。

错误

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

代码

类型.h

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

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

观察者.h

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

主题.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));
            }
        }
};

酒吧.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()) );
        }
};

最佳答案

根据您想要实现的目标,您可以尝试更改(警告,未经测试的代码!):

    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;

关于C++ 模板化主题观察者继承/转换冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11507802/

相关文章:

c++ - 从整数转换为枚举值时如何以及在何处检查错误?

c++ - 防止公共(public)使用用作私有(private)基类的类

c++ - 通过 "pass by value"将一个函数传递给另一个函数

c++ - 如何获得成员函数指针的类?

javascript - 何时在 Kendo UI 数据源和 Observable 中使用以在模板中显示数据

c++ - 使用显式模板参数调用流运算符模板 oerload

c++ - 为什么我不能 push_back 到 const 元素的 vector ?

c++ - 如何在 Metal Shading Language 中定义结构体字段类型?

c++ - 如何复制 shared_ptr 的 vector ?

java - 调用父类(super class)方法而不是子类方法