Newline Asked: 2024-11-10 18:22:54 +0800 CST2024-11-10 18:22:54 +0800 CST 2024-11-10 18:22:54 +0800 CST C++ - 基于范围的循环和命名空间[重复] 772 我读到过,要使自定义容器与基于范围的 for 循环配合使用,“事物”需要位于同一命名空间中。哪些事物需要位于同一命名空间中?begin-end 自由函数及其返回的迭代器?还是 begin-end 函数和传递给它们的容器? c++ 3 个回答 Voted Best Answer user17732522 2024-11-10T18:33:34+08:002024-11-10T18:33:34+08:00 begin并且end需要与容器/范围类型位于同一命名空间(或与该类型关联的其他命名空间),因为范围for循环指定仅通过 ADL 来查找它们。 当然,这是假设您不使用非静态成员函数方法,这对于两者来说都是可以的。 就这样。 n3rada 2024-11-10T18:35:28+08:002024-11-10T18:35:28+08:00 从Microsoft 文档中,我了解到,确保begin和函数在与容器end相同的环境中可访问至关重要。此可访问性允许编译器通过参数相关查找 (ADL)来定位这些函数。namespace Pepijn Kramer 2024-11-10T18:35:30+08:002024-11-10T18:35:30+08:00 不,不必因为 ADL、MRE 而使用 (C++17) 来显示这一点 #include <array> #include <iostream> namespace my_namespace { class my_collection { public: auto begin() { return m_data.begin(); } auto end() { return m_data.end(); } private: std::array<int,10> m_data{}; }; } int main() { my_namespace::my_collection collection; for(auto item : collection ) { std::cout << item << "\n"; } }
begin
并且end
需要与容器/范围类型位于同一命名空间(或与该类型关联的其他命名空间),因为范围for
循环指定仅通过 ADL 来查找它们。当然,这是假设您不使用非静态成员函数方法,这对于两者来说都是可以的。
就这样。
从Microsoft 文档中,我了解到,确保
begin
和函数在与容器end
相同的环境中可访问至关重要。此可访问性允许编译器通过参数相关查找 (ADL)来定位这些函数。namespace
不,不必因为 ADL、MRE 而使用 (C++17) 来显示这一点