在`bar :: foo`的定义中使用`foo`?

时间:2013-12-25 00:21:12

标签: c++ namespaces

如何在名称空间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;
}

2 个答案:

答案 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