c ++命名空间解析(基于参数的“自动使用”?)

时间:2013-06-14 18:21:32

标签: c++ namespaces name-resolution

当我从名称空间外部调用在名称空间中声明的函数时,我通常需要使用名称空间显式地加前缀:

namespace ns1 {
    void myfunc();
}

myfunc();        // compiler complains
ns1::myfunc();   // good

但是我遇到这种情况似乎编译器可以自动设计我想要使用的函数:

namespace mymath {
    struct Vector3 {
        float x, y, z;
    };
    Vector3 vector_cross(const Vector3& lhs, const Vector3 &rhs)
    {
        return lhs; // Pretend this is a cross product
    }
} // ns

int main(int argc, char** argv)
{
    mymath::Vector3 v, w, x;
    x = vector_cross(v, w);   // <---- Here, I do not need to
                              //       prefix with the namespace
    return 0;
}

Q1:是因为编译器可以根据参数类型自动选择合适的函数吗?或其他什么?


经过更多测试后,我发现如果我在另一个命名空间中添加另一个具有相同声明的函数,我的编译器就不会抱怨:

namespace mymath {
    // same as above
} // ns

namespace math2 {
    mymath::Vector3 vector_cross(const mymath::Vector3& lhs, const mymath::Vector3 &rhs)
    {
        return rhs; // Return rhs this time
    }
} // ns

int main(int argc, char** argv)
{
    mymath::Vector3 v, w, x;
    x = vector_cross(v, w);   // <---- Here, which one did the compiler chose?
    return 0;
}

Q2:如何取消激活此行为?

修改 我的编译器:gcc version 4.7.2 (Debian 4.7.2-5)

1 个答案:

答案 0 :(得分:4)

Q1:'适当'是有争议的,但基本上是的,它选择了结合各种“关联”命名空间的功能,对许多样本都适用。

第二季度:你让几十个人加入WG21并最终将“修复ADL”提案中的一个投入生活,这个尝试一直持平。

Q2,实用答案:ADL仅适用于非限定查询,因此您始终可以选择使用限定名称。 (prefix :: std ::等等......)。或者完全停止使用命名空间。除此之外,您还要遵守“Koenig不确定性原则”。