问题实施观察者模式:"成员参考基础类型________不是结构或联合"

use*_*962 8 c++ templates iterator list observer-pattern

我一直在实现一个准确的观察者模式,并且陷入了一个有点神秘的错误:"成员引用基类型'Observer*'不是结构或联合".我认为这与我使用模板有关,我仍然相当不舒服.这是有问题的代码(为了简化事情,删除了大多数缺点/析构函数):

主题界面:

class Subject { 
public:
    virtual void notify();
private:
    list< Observer * > m_observers; 
};
Run Code Online (Sandbox Code Playgroud)

主题实施:

void Subject::notify() {
    list< Observer * >::iterator i;

    for ( i = m_observers.begin(); i != m_observers.end(); i++ ) {
        *i->update( this );                        // ERROR !!! ERROR
}
Run Code Online (Sandbox Code Playgroud)

观察者抽象界面:

class Observer {
public:
    virtual ~Observer();
    virtual void update( Subject * changedSubject ) = 0;

protected:
    Observer();
};
Run Code Online (Sandbox Code Playgroud)

具体观察者界面:

class ConcreteObserver: public Observer {

public:
    ConcreteObserver( ConcreteSubject * );
    virtual ~ConcreteObserver();

    virtual void update( Subject * changedSubject );

private:
    ConcreteSubject * m_subject;
};
Run Code Online (Sandbox Code Playgroud)

具体观察者实施:

void ConcreteObserver::update( Subject * changedSubject ) {
    if ( changedSubject == m_subject ) {
        report();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有人能帮助确定这个问题,我将不胜感激.

干杯,尼克

int*_*jay 12

问题在于运算符优先级.代替:

*i->update( this );
Run Code Online (Sandbox Code Playgroud)

使用:

(*i)->update( this );
Run Code Online (Sandbox Code Playgroud)

否则,它将被解释为*(i->update( this )),它试图在指针上调用方法,从而产生错误消息.