我写了一些代码,但我无法编译它:
#include <cstdio> #include <向量> 使用命名空间标准; 类访客; 类土地{ 上市: virtual void accept(const 访问者 *v); }; 英格兰类:公共土地{ 上市: 无效接受(常量访问者 *v); }; 俄罗斯类:公共土地{ 上市: 无效接受(常量访问者 *v); }; 类访客{ 上市: 无效访问(常量英格兰 *e)常量; 无效访问(常量俄罗斯 *r)常量; }; 班级旅行 { 私人的: 矢量<土地> *l; 上市: 显式旅行(矢量<土地> *_l); 无效接受(访客*v); }; /**/ void 访客::visit(const England *e) const { printf("嘿,这里是英格兰!\n"); } void 访客::visit(const 俄罗斯 *r) const { printf("嘿,这是俄罗斯!\n"); } 无效俄罗斯::accept(const 访问者 *v) { v->访问(这个); } void England::accept(const Visitor *v) { v->访问(这个); } Trip::Trip(vector<Land> *_l):l(_l) {} void Trip::accept(Visitor *v) { for (unsigned i = 0; i < l->size(); i++) { l->at(i).accept(v); } } int main() { 英格兰英格兰; 俄罗斯俄罗斯; 矢量<土地> 旅行计划; trip_plan.push_back(英格兰); trip_plan.push_back(俄罗斯); trip_plan.push_back(英格兰); 行程 my_trip(&trip_plan); 拜访我; my_trip.accept(&me); 返回0; }
这是我从 g++ 得到的:
c++ -ansi -Wall -Wextra -Wconversion -pedantic -Wno-unused-parameter -o vp vp.cc /tmp/ccNanCPR.o:在函数“Land::Land()”中: vp.cc:(.text._ZN4LandC2Ev[Land::Land()]+0xf): undefined reference to `vtable for Land' /tmp/ccNanCPR.o:在函数“Land::Land(Land const&)”中: vp.cc:(.text._ZN4LandC1ERKS_[Land::Land(Land const&)]+0x13): 未定义对“vtable for Land”的引用 /tmp/ccNanCPR.o:在函数“Land::~Land()”中: vp.cc:(.text._ZN4LandD1Ev[Land::~Land()]+0xf): 未定义对“vtable for Land”的引用 /tmp/ccNanCPR.o:(.rodata._ZTI6Russia[typeinfo for Russia]+0x10): undefined reference to `typeinfo for Land' /tmp/ccNanCPR.o:(.rodata._ZTI7England[typeinfo for England]+0x10): undefined reference to `typeinfo for Land' collect2: ld 返回 1 个退出状态
这个问题是基于声明的循环依赖