基本上这个访客类一直在工作,直到我尝试添加另一个类。
我将参考的访客类:
#ifndef Visitor_h__
#define Visitor_h__
#include <stdint.h>
#include <string>
#include <vector>
namespace Ph2_System
{
class SystemController;
}
namespace GUI
{
class SystemControllerWorker;
}
class HwDescriptionVisitor
{
public:
//SystemController
virtual void visit( Ph2_System::SystemController& pSystemController ) {} //This one works
//SystemControllerWorker
virtual void visit( GUI::SystemControllerWorker& pSystemControllerWorker ) {}
}
这是试图对其进行访问的类:
#include "../HWInterface/Visitor.h"
#include "Model/settings.h"
namespace GUI
{
class SystemControllerWorker
{
public:
SystemControllerWorker(Settings &config);
~SystemControllerWorker();
void accept( HwDescriptionVisitor& pVisitor ) const {
pVisitor.visit( *this ); // this is where I get my error message
for ( auto& cShelve : fShelveVector )
cShelve->accept( pVisitor );
}
private:
Settings& m_Settings; //takes in the above &config in the contructor
SystemController
和SystemControllerWorker
之间的唯一区别是第一个不接受任何参数,而这个参数不同。知道为什么我收到此错误消息:
error: no matching function for call to "HwDescriptionVisitor::visit(const GUI::SystemControllerWorker&)"
pVisitor.visit( *this );
或者这可能是什么意思?
答案 0 :(得分:3)
有时阅读整个错误消息是件好事,编译器真的愿意帮助你理解为什么它必须失败:
main.cpp: In member function 'void SystemControllerWorker::accept(HwDescriptionVisitor&) const':
main.cpp:15:29: error: no matching function for call to 'HwDescriptionVisitor::visit(const SystemControllerWorker&)'
pVisitor.visit(*this);
^
main.cpp:15:29: note: candidate is:
main.cpp:8:10: note: void HwDescriptionVisitor::visit(SystemControllerWorker&)
void visit(SystemControllerWorker& pSystemControllerWorker) {}
^
main.cpp:8:10: note: no known conversion for argument 1 from 'const SystemControllerWorker' to 'SystemControllerWorker&'
最后note
是最重要的;它说:&#34; &#39; const SystemControllerWorker&#39; 到&#39; SystemControllerWorker&amp;&#39; &#34;
您可能想知道为什么this
属于const SystemControllerWorker
类型,而不仅仅是SystemControllerWorker
。这是因为调用pVisitor.visit(*this)
的方法本身标记为const
:
void accept( HwDescriptionVisitor& pVisitor ) const {
// right here ~~~~^
这使得this
指向const SystemControllerWorker
并且解除引用它也会导致const
类型。
根据应允许访问的内容,您可以从const
成员函数中删除accept
限定符
OR
将const
限定符添加到SystemController&
成员函数的visit
参数中,如下所示:
virtual void visit( const Ph2_System::SystemController& pSystemController ) {}
// here ~~~~^