gpt4 book ai didi

命名空间中的 C++ 函数不起作用?

转载 作者:太空狗 更新时间:2023-10-29 20:43:36 24 4
gpt4 key购买 nike

这很奇怪,我试图找到为什么第一次调用对象 shape 上的 Draw 是正常的,而第二次调用 Draw “文本”字段仅在提供命名空间前缀时才有效? (即 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;
}

最佳答案

对于 Draw(shape),编译器会在定义 shape 类型的命名空间中查找是否存在名为 Draw 的匹配函数.它找到它并调用它。对于 Draw("test") 参数没有命名空间,因此无处可寻。这称为参数依赖查找,简称ADL。

关于命名空间中的 C++ 函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14905105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com