C++ - 构造函数重载 - 私有和公共
-
22-07-2019 - |
题
你能告诉我为什么下面的代码给我以下错误 - 重载“C(int)”的调用不明确
我认为由于 C(char x) 是私有的,因此只有 C(float) ctor 从外部可见,并且应该通过将 int 转换为 float 来调用它。
但事实并非如此。
class C
{
C(char x)
{
}
public:
C(float t)
{
}
};
int main()
{
C p(0);
}
解决方案
这是“有效的C ++”由Scott迈耶讨论。究其原因,这是不明确的是,他们希望确保只改变一个成员的可见性不会在其他地方改变已经存在的代码的含义。
否则,假设你的C类是在报头中的某个地方。如果你有一个私人℃(中间体)的成员,你的代码目前将调用C(浮动)。如果由于某种原因,C(INT)成员被公开,老代码会突然打电话会员,即使没有了的旧代码,也叫功能已经改变了的。
编辑:更多的原因:
更糟的是,假设有以下2个功能:
C A::foo()
{
return C(1.0);
}
C B::bar()
{
return C(1.0);
}
这两个功能可以调用不同的函数取决于foo或条是否被宣布为C的朋友,或是否A或B从它继承。具有相同代码呼叫不同的功能是可怕的。
(这可能不是如把斯科特迈耶的讨论,但是这想法。)
其他提示
0 是一个 int
类型。因为它可以同等地隐式转换为 float 或 char,所以该调用是不明确的。 可见性与这些目的无关。
要么放 0.0
, 0.
, , 或者 0.0f
, ,或者摆脱 C(char)
完全构造函数。
编辑:标准的相关部分,第 13.3 节:
3) [...]但是,一旦确定了候选函数和参数列表,最佳函数的选择在所有情况下都是相同的:
- 首先,选择候选函数的子集(具有适当数量的参数并满足某些其他条件的函数)以形成一组可行函数(13.3.2)。
- 然后,根据将每个参数与每个可行函数的相应参数匹配所需的隐式转换序列(13.3.3.1)来选择最佳可行函数。
4) 如果存在最佳可行函数并且是唯一的,则重载决策成功并产生结果。否则重载解析失败并且调用格式错误。当重载决策成功,并且最佳可行函数在使用它的上下文中不可访问(第 11 条)时,程序是格式错误的。
请注意,可见性不是选择过程的一部分。
我不认为:
C p(0);
被转换为:
C(float t)
你可能需要做的:
C p(0.0f);
不隶属于 StackOverflow