分享
三行代码  ›  专栏  ›  技术社区  ›  Kostya

使用默认构造函数对带有一个参数的静态成员进行直接初始化[重复] - Direct initialization of a static member with one argument with the default constructor [duplicate]

  •  0
  • Kostya  · 技术社区  · 1 周前

    这个问题已经有了答案:

    当我试图使用临时对象初始化静态成员变量时,我得到错误c263“不是函数”。为什么编译器看到的是函数声明而不是成员初始化,如何避免这种情况?

    这种情况只在使用单个参数进行直接初始化时发生。复制初始化可以解决这个问题,但前提是对应的构造函数不是显式的。

    struct A {
        int Value;
        A() : Value( 5 ) {}
    };
    
    struct B {
        int Value;
    
        B( A a ) : Value( a.Value ) {}
        B( int v ) : Value( v ) {}
        B( A a, int v ) : Value( a.Value + v ) {}
    };
    
    struct C {
        static B b1, b2, b3, b4;
    };
    
    B C::b1( A() ); //  error C2063
    B C::b2( 2 );   //  OK
    B C::b3 = A();  //  OK
    B C::b4( A(), 3 );  //  OK
    

    MSVS编译器输出: 错误C2063:“C::B1”:不是函数

    其他编译器输出: 错误:没有在C类中声明B C::B1(A(*)(0))成员函数

    1 回复  |  直到 1 周前
        1
  •  0
  •   Vlad from Moscow    1 周前

    例如使用表达式

    B C::b1( ( A() ) );
    

    B C::b1{ A() };
    

    否则编译器将此构造视为函数声明。