当前位置: 首页 > 知识库问答 >
问题:

编译器在程序代码中提供私有构造函数作为候选

许自强
2023-03-14
#include <iostream>

using namespace std;

class Test{
private:
    Test(int a, int b=0)
    {
        cout << "private constructor\n";
    }
public:
    Test(int a)
    {
        cout << "public constructor\n";
    }
};

int main()
{
    Test t(1);
}
test.cpp: In function ‘int main()’:
test.cpp:20:10: error: call of overloaded ‘Test(int)’ is ambiguous
  Test t(1);
          ^
test.cpp:12:2: note: candidate: Test::Test(int)
  Test(int a)
  ^
test.cpp:7:2: note: candidate: Test::Test(int, int)
  Test(int a, int b=0)
  ^
test.cpp:5:7: note: candidate: Test::Test(const Test&)
 class Test{
       ^
test.cpp:20:7: error: call to constructor of 'Test' is ambiguous
        Test t(1);
             ^ ~
test.cpp:7:2: note: candidate constructor
        Test(int a, int b=0)
        ^
test.cpp:12:2: note: candidate constructor
        Test(int a)
        ^
test.cpp:5:7: note: candidate is the implicit copy constructor
class Test{
      ^
1 error generated.

共有1个答案

高自怡
2023-03-14

根据标准,由于明确的原因,它是模棱两可的:

[class.access/5]

应该注意的是,受控制的是对成员和基类的访问,而不是它们的可见性。成员的名称仍然可见,当这些成员和基类不可访问时,仍然考虑对基类的隐式转换。对给定构造的解释是不考虑访问控制而建立的。如果建立的解释使用不可访问的成员名称或基类,则构造格式不正确。

int const default_b = 0;

// ...

return Test{a, default_b};
 类似资料:
  • 为什么java编译器在类包含任何参数化构造函数时不提供默认构造函数。

  • 问题内容: 如果一个类包含一堆静态方法,为了确保没有人错误地初始化该类的实例,我做了一个私有的构造函数: 现在..鉴于无法看到构造函数,该如何进行测试?可以测试吗? 问题答案: 使用反射,您 可以 调用私有构造函数: 但是,您甚至可以做到这一点: 通过在构造函数中引发异常,可以防止所有尝试。 我也会自己上课,因为“因为”:

  • //模块 //组件 `//预登录Presenter //预物流活动` //在一次创建中 //错误日志 错误:(18,53)错误:找不到符号类DaggerPresentComponent错误:(19,53)错误:找不到符号类DaggerUserLoginComponent错误:(19,10)错误:gorick.gradesprojectandroid.MVP. Presenter. Presente

  • 本文向大家介绍解析C#中的私有构造函数和静态构造函数,包括了解析C#中的私有构造函数和静态构造函数的使用技巧和注意事项,需要的朋友参考一下 私有构造函数 私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。例如: 声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问

  • 问题内容: 为什么将只有私有构造函数的类标记为final是一个好习惯?我的猜测是,要让其他程序员知道它不能被子类化。 问题答案: 将类定为final具有一些(小的)性能提升,因为JIT编译器可以内联该类的功能。我不知道这是否符合“良好做法”的要求,但是我看到了好处。

  • 问题内容: 在Java中,在抽象类中使用私有构造函数的目的是什么? 在一个评论中,我得到了这个问题,我很好奇,在什么情况下我们需要以这种方式使用构造函数? 我认为它可以与抽象类中的另一个构造函数一起使用,但这非常简单。它也可以用于构造将超过抽象类的静态内部类。 也许还有更优雅的用法? 问题答案: 如果构造函数是类的 唯一 构造函数,则原因很明确:防止子类化。一些类仅充当静态字段/方法的持有者,而不