我写了一些代码,但我无法编译它:
#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 个退出状态
这个问题是基于声明的循环依赖