gpt4 book ai didi

c++ - 编译器无法通过 ADL 找到基类方法

转载 作者:搜寻专家 更新时间:2023-10-31 01:44:02 25 4
gpt4 key购买 nike

这是怎么回事——为什么不能编译?

#include <iostream>
class Base {
void print(double d) {
std::cout << "Base: " << d << std::endl;
}
};

class Derived : public Base {
void print(std::string const & str) {
std::cout << "Derived: " << str << std::endl;
}
};

int main(int argc, char* argv[]) {
Derived d;
d.print(2.);
d.print("junk");
}

(MinGW 和 VC11 中的错误等同于No conversion from double to std::string。)

如果我在 Derived 中更改打印函数的名称,它会成功编译,所以显然 Derived::print(string const &) 正在屏蔽 Base::print(double) 不知何故。但我的印象是函数签名包含参数类型,因此应该在此处进行屏蔽。对于基类方法,这不正确吗?

最佳答案

不,这是不正确的:当在同一范围内声明具有相同名称的函数时会发生名称隐藏:此处 print in Derived hides Baseprint

在函数查找的这个(第一步)步骤中忽略参数名称/类型。

您可以使用 using 声明将 Base 函数的声明带入 Derived 函数:

using Base::print

如果您这样做,将进行常规的重载解析。

有关为什么在这种 Derived/Base 情况下会发生隐藏的详细信息,我建议 this other SO post完美地回答了这个问题。

至于标准,此特定规则在第 3.3.1 节中定义:

Name hiding [basic.scope.hiding]

A name can be hidden by an explicit declaration of that same name in a nested declarative region or derived class (10.2).

关于c++ - 编译器无法通过 ADL 找到基类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24129551/

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