错误 C2228:'.visitFile'左侧必须具有类/结构/联合类型

Error C2228: left of '.visitFile' must have class/struct/union type

本文关键字:类型 结构 C2228 visitFile 错误      更新时间:2023-10-16

Visitor.h

class Visitor{
public:
    virtual ~Visitor() {}
    virtual void visitNode(Node*) = 0;
    virtual void visitFile(File*) = 0;
    virtual void visitDirectory(Directory*) = 0;
    virtual void visitLink(Link*) = 0;
protected:
    Visitor();
    Visitor(const Visitor&);
};
//realize those visit function
void Visitor::visitNode(Node* n) {
    //common default behavior
    cerr << "It is not a directory! " << endl;
}
void Visitor::visitDirectory(Directory* d) {
    Visitor::visitNode(d);
}
void Visitor::visitFile(File* f) {
    Visitor::visitNode(f);
}
void Visitor::visitLink(Link* l) {
    Visitor::visitNode(l);
}

文件.h

class File : public Node {
public:
    File();
    //redeclare common interface here
    void setName(string& name);
    string& getName();
    void setCDate(char* cDate);
    char* getCDate();
    long size();
    virtual void accept(Visitor*) = 0;
private:
    string& name;
    char* cDate;
};
//realize the function accept
void File::accept(Visitor* v) {
    v.visitFile(this);
}

问题是函数accept(Visitor* v){},我的编译器总是告诉我:

d:win7 datadatacfilemanagefile.h(20) : error C2228: left of '.visitFile' must have class/struct/union type

我该如何处理?

v是一个指针,应该调用operator->并且应该*this

void File::accept(Visitor* v) {
    v->visitFile(*this);
//   ^^          ^
}