如何在名称空间foo
内引用没有名称空间的函数bar
,该名称空间已经声明了相同的函数foo
(也是相同的参数)?
int foo(int x) { // base function
return 2*x; // multiplies input by 2
}
namespace bar {
float foo(int x) { // same function
return (float)foo(x); // uses same math of original, but returns a float
}
}
我当然可以重命名bar::foo
,但由于命名空间之外不存在歧义问题,我不希望并且愿意为任何用户保持简单。
我正在尝试重新定义tan
以返回向量而不是数字(因此也是x值)。这是我想要做的简化版本。
#define _USE_MATH_DEFINES // enables mathematical constants
#include <cmath> // tan
template <typename T>
struct Vector2 { // simple Vector2 struct
T x,y;
};
namespace v2 {
template <typename T>
Vector2<T> tan(T angle) { // redefine tan to return a Vector2
Vector2<T> result;
if (-90 < angle && angle < 90)
result.x = 1;
else
result.x = -1;
result.y = tan(angle); // <-- refers to v2::tan instead of tan
return result;
}
}
int main() {
double tangens = tan(3.*M_PI_4); // M_PI_4 = pi/4
Vector2<double> tangens2 = v2::tan(3.*M_PI_4); // <-- no ambiguity possible
return 0;
}
答案 0 :(得分:5)
您需要通过明确提供其范围来引用该类型。在这种情况下,您尝试调用的foo
版本驻留在全局命名空间中,因此您可以像这样访问它...
::foo(x);
将此应用于您的代码...
namespace bar
{
float foo(int x)
{ // same function
return (float)::foo(x); // uses same math of original, but returns a float
// ^^ scope qualified name
}
}
答案 1 :(得分:3)
“没有命名空间”的功能实际上属于全局命名空间。您可以将其称为::foo
。