3

これは奇妙で、名前空間のプレフィックスを指定する場合にのみ「テキスト」フィールドでの Draw への 2 番目の呼び出しが機能するのにDraw、オブジェクトでの最初の呼び出しは問題ない理由を見つけようとしていますか? shape(すなわちShapes::Draw):

#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;
}
4

2 に答える 2

3

Draw(shape)コンパイラは、s型が定義されている名前空間を調べて、。shapeという名前の一致する関数があるかどうかを確認しますDraw。それを見つけて呼び出します。なぜならDraw("test")、引数の名前空間がないので、他に探す場所がないからです。これは、引数依存ルックアップ、略してADLと呼ばれます。

于 2013-02-15T23:35:45.700 に答える
2

これは、引数依存のルックアップと呼ばれます。修飾されていない関数が呼び出されると、コンパイラは関数のすべての引数について名前空間を調べ、一致する関数をオーバーロードセットに追加します。だからあなたが言うとき、それは議論に基づいDraw(shape)て見つけます。しかし、あなたが言うとき、引数には名前空間がなく、確かに必要な名前空間ではありません。Shapes::Draw(const Shapes::Shape& shape)shapeDraw("test")"test"Shapes::

于 2013-02-15T23:35:54.220 に答える