C++中缺少命名空间限定符没有错误
no error on lack of namespace qualifiers in C++
我正在做一个小C++项目,遇到了一些关于命名空间的行为,这对我来说看起来真的很奇怪。我已经在命名空间中定义了我所有的类和函数my_project
:
// point.hpp:
namespace my_project {
template <size_t dim> class Point { /* snip */ };
}
// convex_hull.hpp:
namespace my_project {
std::vector<size_t> convex_hull(const std::vector<Point<2> >& xs);
}
然后我去为所有内容编写一个测试:
// convex_hull_test.cpp:
#include <my_project/convex_hull.hpp>
using my_project::Point;
int main()
{
Point<2> p1 = /* snip */;
std::vector<Point<2> > xs = {p1, p2, p3, p4, p5, p6};
std::vector<size_t> hull = convex_hull(xs);
/* snip */
return 0;
}
一切都很好,但第二天我又看了一遍,意识到我应该写下这一行:
std::vector<size_t> hull = my_project::convex_hull(xs);
因为我从来没有using my_project::convex_hull
过任何地方。然而,当我编译它时,我没有因为使用未定义的符号而收到任何错误。为什么我可以在没有命名空间前缀的情况下使用此函数?
对于我定义的其他几个函数也是如此。当我离开行using my_project::Point;
时,我确实会在没有命名空间限定的情况下使用Point
而出错。关于命名空间限定的函数、类或模板是否有不同的规则?规则是否相同,表明还有其他奇怪的事情发生?
我在多台机器上用 clang、g++ 和 icc 尝试过这个。我试图构造一个最小的测试用例,但编译器抛出了我认为在这种情况下应该出现的错误。
xs
的类型必须在命名空间my_project
中可用。正在发生的事情称为依赖于参数的查找。
C++标准允许这样做。如果要预防 ADL,请尝试
std::vector<size_t> hull = (convex_hull)(xs);
放置括号可以防止依赖于参数的查找,请尝试一下,编译器应该抱怨。
编辑:基于OP的编辑
参见艾伦·斯托克斯(Alan Stokes)对此答案的评论。
相关文章:
- 使用命名空间时出现多个定义错误
- 如何使用 soong 命名空间来有条件地编译模块
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 我该怎么做才能摆脱使用命名空间时的语法错误?
- 有没有办法不使用命名空间中的项?
- 命名空间中有 2 个同名的类
- C++ Visual Studio 错误:名称后跟'::'必须是类或命名空间名称 (DirectX 11)
- 在 C++ 中使用命名空间时出现"does not name a type"错误
- C++命名空间中调用 void 函数的错误
- 无法获取 wig %ignore 以忽略命名空间中的类,从而导致编译错误
- 为什么 Clang 在命名空间'std'中没有名为 'copy' 的成员给出错误
- 有没有办法在不使用命名空间 std 或前缀 std:: 的情况下引用 cout?
- 名称后跟"::"必须是类或命名空间错误,即使"::"后面是类名
- 错误:命名空间“PQXX”中的“行”未命名类型
- Xcode 标头错误 - 命名空间'_STL'未包含命名空间'_Rep'
- glm:不是类型或命名空间吗?我的标题中有一个令人困惑的错误
- 在Boost和Qt库中有哪些命名空间标识符
- 错误:命名空间' boost::asio '中的' signal_set '没有命名类型
- 错误:命名空间' std '中的' chrono '没有命名类型