конструктор по умолчанию сложного класса не работает

Согласно http://www.cplusplus.com/reference/complex/complex/complex/, класс complex<double> имеет конструкцию по умолчанию в форме complex (double re = 0.0, double im = 0.0);. Однако я не знаю, действительно ли это правильно. Может ли кто-нибудь объяснить странное поведение кода ниже?

#include <iostream>
#include <complex>
#include <typeinfo>
using namespace std;

int main() {

    complex<double> cmp1(1, 2);
    complex<double> cmp2(1); //isn't the same as cmp2(1, 0.0) ?
    complex<double> cmp3(); //isn't the same as cmp3(0.0, 0.0) ?

    cout << cmp1.real() << "\n"; //=> 1
    cout << cmp1.imag() << "\n"; //=> 2

    cout << cmp2.real() << "\n"; //=> 1
    cout << cmp2.imag() << "\n"; //=> 0

    //cout << cmp3.real() << "\n"; //error (why?) //mark1
    //cout << cmp3.imag() << "\n"; //error (why?)

    /* error message output by `mark1`: */
    /* request for member ‘real’ in ‘cmp3’, which is of */
    /* non-class type ‘std::complex<double>()’ */

    cout << cmp3 << "\n"; //=> 1 (why?)

    cout << typeid(cmp1).name() << "\n"; //=> St7complexIdE
    cout << typeid(cmp2).name() << "\n"; //=> St7complexIdE
    cout << typeid(cmp3).name() << "\n"; //=> FSt7complexIdEvE

}

Окружающая среда:

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609

Вариант компиляции:

$ g++ -Wall -std=c++98 <file name>

person ynn    schedule 21.03.2018    source источник
comment
Самый неприятный разбор? --› Нет.   -  person user202729    schedule 21.03.2018
comment
Это объявление функции. Поиск неприятный разбор.   -  person llllllllll    schedule 21.03.2018
comment
Поздравляем, теперь вы MVP   -  person M.M    schedule 21.03.2018
comment
complex<double> cmp3(); объявляет функцию с именем cmp3, не принимающую параметров и возвращающую complex<double>.   -  person Matteo Italia    schedule 21.03.2018
comment
complex<double> cmp3(); — это объявление функции с именем cmp3(), которая не принимает аргументов и возвращает complex<double>. Удалите (), если вы хотите объявить переменную типа complex<double>.   -  person Peter    schedule 21.03.2018
comment
Похоже, что каждый раз, когда повторяющийся вопрос задается снова, его канонический дубликат снова получает голосование.   -  person user202729    schedule 21.03.2018


Ответы (1)


сдача:

complex<double> cmp3(); //isn't the same as cmp3(0.0, 0.0) ?

to

complex<double> cmp3; //isn't the same as cmp3(0.0, 0.0) ?

и он должен работать нормально

Это происходит потому, что компилятор может предположить, что это объявление функции

person Ch1v1    schedule 21.03.2018