C++ c++;命名空间中的函数赢得';不行?

C++ c++;命名空间中的函数赢得';不行?,c++,C++,这很奇怪,我正在试图找到为什么第一次调用对象shape上的Draw很好,而第二次调用“text”字段仅在提供名称空间前缀时有效?(即Shapes::Draw): #包括 名称空间形状 { 阶级形态{ 公众: 形状(){} 虚空InnerDraw()常量{ std::cout对于Draw(shape)编译器在定义shapes type的命名空间中查找,以查看是否有名为Draw的匹配函数。它找到它,并调用它。对于Draw(“test”)没有参数的名称空间,因此没有其他地方可以查看。这称为参数相关查找

这很奇怪,我正在试图找到为什么第一次调用对象
shape
上的
Draw
很好,而第二次调用“text”字段仅在提供名称空间前缀时有效?(即
Shapes::Draw
):

#包括
名称空间形状
{
阶级形态{
公众:
形状(){}
虚空InnerDraw()常量{

std::cout对于
Draw(shape)
编译器在定义
shape
s type的命名空间中查找,以查看是否有名为
Draw
的匹配函数。它找到它,并调用它。对于
Draw(“test”)
没有参数的名称空间,因此没有其他地方可以查看。这称为参数相关查找,简称ADL。

这是调用的。当调用非限定函数时,编译器会参考函数所有参数的名称空间,并将任何匹配函数添加到重载集中。因此你说
Draw(shape)
它会根据
shape
参数找到
Shapes::Draw(const Shapes::shape&shape)
。但是当你说
Draw(“test”)
时,参数
“test”
没有名称空间,当然也没有所需的
形状::
名称空间。

Google König lookup–抱歉,如果在调用时可以在作用域中找到函数,Koenig lookup to preciseADL也适用。ADL找到的函数被添加到重载集中。注释消失。我在
main
中没有看到两个调用。complettely误解了这个问题,因为其中一个
绘图
超载。有点醉了。@LightnessRacesinOrbit-开车出去兜风。你没法写代码。
@LightnessRacesinOrbit这次我们会原谅你的。干杯!
#include <iostream>
namespace Shapes
{
    class Shape {
        public:
            Shape() {}
            virtual void InnerDraw() const {
                std::cout << "Shape\n";
            }
    };

    class Square : public Shape {
        public:
            void InnerDraw() { std::cout << "Square\n"; }
    };

    void Draw(char* text) { std::cout << text; }

    void Draw(const Shape& shape) {
        Draw("Inner: ");
        shape.InnerDraw();
    }

    Shape operator+(const Shape& shape1,const Shape& shape2){
        return Shape();
    }
}


int main() {
    const Shapes::Square square;
    Shapes::Shape shape(square);

    Draw(shape); // No need for Shapes::
    Draw("test"); // Not working. Needs Shapes:: prefix

    return 0;
}