所以我写了一个可以处理类似JSON内容的对象,其中有一个最小的例子:
#include <iostream>
#include <vector>
#include <variant>
struct Array;
struct Value;
struct Array: public std::vector<Value>{
using std::vector<Value>::vector;
};
struct Value: public std::variant<bool, int, Array>{
using std::variant<bool, int, Array>::variant;
};
现在,我想重载输出流运算符。这是代码:
std::ostream& operator <<(std::ostream& os, const Value value);
std::ostream& operator <<(std::ostream& os, const Array array);
std::ostream& operator <<(std::ostream& os, const Array array){
for (auto &a : array){
os << a << ", ";
}
return os;
}
std::ostream& operator <<(std::ostream& os, const Value value){
os << value;
return os;
}
现在,如果我尝试运行它:
int main()
{
Array a {1,2,3}; // OK
std::cout << a; // Segfault
}
渔获物在哪里?
编辑正如所指出的,存在一个递归循环。
答案 0 :(得分:4)
由于无限递归,您的堆栈溢出:
std::ostream& operator <<(std::ostream& os, const Value value){ os << value; // call to self return os; }
这是将变体插入流中的正确方法:
std::visit([&](const auto& value) {
os << value;
}, static_cast<const Value::variant&>(value));