gpt4 book ai didi

C++ 错误 : invalid conversion from (base class template) to subclass

转载 作者:行者123 更新时间:2023-11-27 23:54:22 25 4
gpt4 key购买 nike

我在一个项目中成功地使用了主题-观察者模式。随着 Subject-Observer 和消息类型的数量增长到 5 种以上,我发现自己在为每一种复制相同的代码模式。我正在尝试切换到 Subject-Observer 模式的类模板。但是我陷入了无法解决的编译器错误(尽管付出了努力):

Building file: ../main.cpp
Invoking: GCC C++ Compiler
g++ -std=c++0x -O3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp"
../main.cpp: In instantiation of ‘Observer<T_subject, T_message>::~Observer() [with T_subject = RotationSubject; T_message = long unsigned int]’:
../main.cpp:49:7: required from here
../main.cpp:39:15: error: invalid conversion from ‘Observer<RotationSubject, long unsigned int>* const’ to ‘RotationObserver*’ [-fpermissive]
~Observer(){ subject->UnregisterObserver( this ); }
^
../main.cpp:10:7: error: initializing argument 1 of ‘void Subject<T_observer, T_message>::UnregisterObserver(T_observer*) [with T_observer = RotationObserver; T_message = long unsigned int]’ [-fpermissive]
void UnregisterObserver( T_observer* observer ){
^
make: *** [main.o] Error 1

最小的工作示例代码是:

#include <vector>

template <class T_observer, typename T_message> class Subject
{
public:
void RegisterObserver( T_observer* observer ){
observers.push_back(observer);
}

void UnregisterObserver( T_observer* observer ){
for (auto itr = begin(observers); itr != end(observers); itr++){
if (*itr == observer){
itr = observers.erase(itr);
if (itr == observers.end()) break;
}
}
}

void NotifyObservers( T_message message ){
for(auto const& itr : observers){
itr->ReceiveMessage( message );
}
}

std::vector < T_observer * > observers;
};


template <class T_subject, typename T_message> class Observer
{
public:

Observer( T_subject* subject )
: subject( subject )
{
subject->RegisterObserver( this );
}

~Observer(){ subject->UnregisterObserver( this ); }

virtual void ReceiveMessage( T_message message ) {};
// Observer sub-classes define ReceiveMessage

T_subject* subject;
};

class RotationSubject;// forward declaration prevents circular dependency

class RotationObserver : public Observer< RotationSubject, unsigned long>
{
public:
RotationObserver( RotationSubject* rotation_subject );
};

class RotationSubject : public Subject< RotationObserver, unsigned long>
{ };

int main(int argc, char * argv[]){
RotationSubject* pRotSubject = new RotationSubject( );
RotationObserver* pRotObserver = new RotationObserver( pRotSubject );
pRotObserver->~RotationObserver();
return 0;
}

目的是定义从这些基类模板派生的子类,如此处所示 RotationSubjectRotationObserver .类型标识符的动机 T_observerT_subject具体说明哪些子类可以配对,例如RotationObservers应该只观察 RotationSubjects , 并接收 Rotation 消息类型( T_message 在本例中为 unsigned long)。

如果我正确阅读错误消息,Observer<RotationSubject, long unsigned int>* const 不是 RotationObserver* ,或者编译器不知道如何转换。

我探索了循环依赖和 const 的原因,但没有成功。

请帮助我了解此错误消息的原因,并在可能的情况下进行最少的编辑以更正。这是我的主要问题。

我对完全不同的设计和改进建议持开放态度。

最佳答案

你正在丢弃一个 const预选赛。没有 const_cast 就做不到一个很好的理由。

您还试图以“错误”的方向进行转换。不是每个 Observer< RotationSubject, unsigned long>必然是 RotationObserver ,虽然反过来也是正确的。你可以让它与 dynamic_cast 一起工作(或使用 static_cast 和 promise )。

关于C++ 错误 : invalid conversion from (base class template) to subclass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43781723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com