Заявление, которое вызывает конструктор и ничего не делает с ним - почему он не компилируется? - PullRequest
1 голос
/ 03 декабря 2011

Можем ли мы иметь оператор, который вызывает конструктор и ничего не делает с ним?

По сути, я перегружаю конструктор и использую конструкторы, не назначая его переменной, как обычно. (Обычно мы бы этого не делали, но я мог видеть это при использовании функторов, возможно.)

Есть идеи? .... (Я объявил конструктор копирования закрытым, просто чтобы убедиться, что это не является причиной проблемы.)

class myClass
{
    public:
        myClass (int n, int x) { }
        myClass (int n ) { }
    private:
        myClass (const myClass & t){}  // copy constructor is private..... 
};

int main()
{
    int r = 5;
    myClass A( r );     // OK (as per usual)
    myClass ( r, r );   // OK
    myClass ( 5 );      // OK
    myClass ( r );      // not OK : error C2371: 'r' : redefinition; different basic types

    // myClass B = myClass ( r ); // this would not work as copy constructor
                                  // has been declared as private
    return 0;
}

Ответы [ 2 ]

3 голосов
/ 03 декабря 2011

Вы должны сказать (myClass(r)); с дополнительными скобками из-за правил синтаксического анализа C ++.

(То, что вы сказали, это объявление новой переменной с именем r, которая уже существует. Обратите внимание, что вы также можете сказать int(r);, чтобы объявить r.)

0 голосов
/ 03 декабря 2011

Строка myClass (r); фактически интерпретируется как определение переменной r типа myClass (myClass r;), которая уже определена как int.

...