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

C++ c++;名称空间解析(“自动使用”基于参数?),c++,namespaces,token-name-resolution,C++,Namespaces,Token Name Resolution,当我从名称空间之外调用在名称空间中声明的函数时,通常需要显式地使用名称空间作为前缀: namespace ns1 { void myfunc(); } myfunc(); // compiler complains ns1::myfunc(); // good namespace mymath { // same as above } // ns namespace math2 { mymath::Vector3 vector_cross(cons

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

namespace ns1 {
    void myfunc();
}

myfunc();        // compiler complains
ns1::myfunc();   // good
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;
}
然而,在这种情况下,编译器似乎可以自动设计出我想要使用的函数:

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;
}
名称空间mymath{
结构向量3{
浮动x,y,z;
};
矢量3矢量交叉(常数矢量3和lhs、常数矢量3和rhs)
{
return lhs;//假设这是一个叉积
}
}//ns
int main(int argc,字符**argv)
{
向量3v,w,x;

x=vector_cross(v,w);//Q1:“适当”是有争议的,但本质上是肯定的,它选择的函数组合了所有类型的“关联”名称空间,这对许多示例都适用

问题2:你让几十个人加入WG21,最后投票给life一个“修复ADL”提案,到目前为止,这些尝试都失败了


问题2,务实的回答:ADL只适用于非限定查找,因此您始终可以选择使用限定名称。(前缀::std::等等…)。或者完全停止使用名称空间。除此之外,您需要遵守“Koenig不确定性原则”。

“参数相关查找”是搜索词。你应该尝试发布一个工作示例的原因之一是,它表明你自己也尝试过这样一个示例,要让上面的代码实现你所说的功能,唯一的方法是使用语句或从mymath范围内的内容调用vector_cross。我建议您努力找到一个最小的复制,这将揭示原因。@GManNickG:谢谢,我会检查的this@kfsone:我自己也试过这样一个例子,我只是去掉了
main()
函数可以让问题变得更短——我把它放回原处,这样人们就可以复制/粘贴代码。但是,我根本没有使用任何使用
语句的
。Herp on me:我无法重新创建在粘贴您的编辑后不起作用的版本。ADL它是:(