gpt4 book ai didi

c++ - 为什么引用的dynamic_cast会导致段错误?

转载 作者:行者123 更新时间:2023-12-02 18:07:13 24 4
gpt4 key购买 nike

我有一个 expr_t 基类,ident_t 是从该基类派生的。我编写了一些 to_string 重载,以在 expr_tident_t 之间显示不同的内容:

#include <iostream>
#include <string>

struct expr_t {
virtual ~expr_t() {}
};

struct ident_t : public expr_t {
std::string name;

ident_t(std::string name) : name(name) {}
};
std::string to_string(expr_t& v) {
if (auto* id = dynamic_cast<ident_t*>(&v)) {
return to_string(*id);
}
return "error";
}
std::string to_string(ident_t& v) {
return v.name;
}

int main() {
expr_t* b = new ident_t("c");
std::cout << to_string(*b) << std::endl; // segfault
delete b;
return 0;
}

但是,使用 GDB 调试时不会生成任何输出,并且会出现段错误。

最佳答案

问题是,在调用return to_string(*id)时,编译器没有第二个重载std的声明: :string to_string(ident_t& v)。因此,相同的第一个版本将被递归调用,最终导致段错误。

解决这个问题,您可以将第二个重载的定义移到第一个重载之前,或者在第一个重载的定义之前向前声明第二个重载,如下所示:

//moved the 2nd overload above first overload
std::string to_string(ident_t& v) {
return v.name;
}

std::string to_string(expr_t& v) {
if (auto* id = dynamic_cast<ident_t*>(&v)) {
return to_string(*id); //now compiler knows about std::string to_string(ident_t& v)
}
return "error";
}

Demo

方法2

//forward declaration for 2nd overload
std::string to_string(ident_t& v);

std::string to_string(expr_t& v) {
if (auto* id = dynamic_cast<ident_t*>(&v)) {
return to_string(*id); //now compiler knows about std::string to_string(ident_t& v)
}
return "error";
}
//definition for 2nd overload
std::string to_string(ident_t& v) {
return v.name;
}

Demo

关于c++ - 为什么引用的dynamic_cast会导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73009682/

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