我正在处理一个类,该类在没有外部声明的情况下在该类中定义了一个朋友功能
namespace our_namespace {
template <typename T>
struct our_container {
friend our_container set_union(our_container const &, our_container const &) {
// meaningless for the example here, just a valid definition
// no valid semantics
return our_container{};
}
};
} // namespace our_namespace
如所讨论的(例如here或here),函数set_union
不在our_namespace
命名空间中,但可以通过依赖于参数的查找来找到:
auto foo(std::vector<our_namespace::our_container<float>> in) {
// works:
return set_union(in[0], in[1]);
}
但是我注意到in the debug flags set_union
似乎位于our_namespace
命名空间中
mov rdi, qword ptr [rbp - 40] # 8-byte Reload
mov rsi, rax
call our_namespace::set_union(our_namespace::our_container<float> const&, our_namespace::our_container<float> const&)
add rsp, 48
pop rbp
ret
our_namespace::set_union(our_namespace::our_container<float> const&, our_namespace::our_container<float> const&): # @our_namespace::set_union(our_namespace::our_container<float> const&, our_namespace::our_container<float> const&)
push rbp
mov rbp, rsp
mov qword ptr [rbp - 16], rdi
mov qword ptr [rbp - 24], rsi
pop rbp
ret
尽管我不能称其为our_namespace::set_union
auto foo(std::vector<our_namespace::our_container<float>> in) {
// fails:
return our_namespace::set_union(in[0], in[1]);
}
是否有任何关于如何理解调试信息的提示?
编辑:set_union
函数体只是此处具有有效定义的稻草狗示例。
答案 0 :(得分:5)
C ++标准仅定义有关代码编译和结果程序行为的编译器行为。它没有定义代码生成的所有方面,尤其是没有定义调试符号。
因此您的编译器正确地(按照标准)不允许通过它不存在的名称空间调用该函数。但是由于该函数确实存在并且您应该能够对其进行调试,因此需要将调试符号放在某个位置。封闭名称空间似乎是一个合理的选择。