Я имею дело с классом, который определяет функцию друга в классе без внешнего объявления
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
Как обсуждалось (например, здесь или здесь )функция set_union
не находится в пространстве имен our_namespace
, но будет найдена в зависимости от аргументов:
auto foo(std::vector<our_namespace::our_container<float>> in) {
// works:
return set_union(in[0], in[1]);
}
Однако я заметил, что в флагах отладки 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
является только примером, чтобы иметь правильное определение.