【发布时间】:2026-02-06 09:15:02
【问题描述】:
如果我们在全局命名空间中有一个函数,并且在另一个命名空间中有一个具有不同参数类型的重载,那么 C++Builder 编译器似乎无法从全局命名空间中找到该函数。
namespace A
{
class a {
friend void swap(a& first, a& second) { }
};
}
class b {
friend void swap(b& first, b& second) { }
};
namespace C
{
class c {
A::a dataA;
b dataB;
friend void swap(c& first, c& second)
{
swap(first.dataA, second.dataA); // no problem
swap(first.dataB, second.dataB); // VC++12 compiles, C++Builder XE doesn't
}
friend void swap2(c& first, c& second) // no problem with a different name
{
swap(first.dataA, second.dataA);
swap(first.dataB, second.dataB);
}
};
}
C++Builder 出现以下错误:
E2357 Reference initialized with 'b', needs lvalue of type 'c'
E2342 Type mismatch in parameter 'first' (wanted 'c &', got 'b')
Visual C++ 2012 编译这个没有错误。
我明白了,即使存在同名不同参数类型的函数,也应该找到全局命名空间中的函数。
我是否遗漏了什么,或者这是 C++Builder 中的错误?
【问题讨论】:
-
也可以用 MinGW 编译。
标签: c++ namespaces c++builder c++builder-xe name-lookup