C ++ «Нет совпадения для оператора & gt;» при компиляции на -std = c ++ 11

У меня есть функция, которая загружает данные (числа) из файла в сложную таблицу. Все компилируется без ошибок на -std = c ++ 98, но когда я хочу скомпилировать с -std = c ++ 11, возникает проблема с оператором >>.

template <typename T> void load(char name[], complex<T> table[], int len) {

ifstream dane;
dane.open(name);
for (int i = 0; i < 2 * len; i++)
(i % 2 == 0 ? dane >> table[i / 2].real() : dane >> table[(i - 1) / 2].imag());

dane.close();
}no match for 'operator>>' in 'dane >> (table + ((sizetype)(((unsigned int)((i + -1) / 2)) * 16u)))->std::complex<double>::imag()'
no match for 'operator>>' in 'dane >> (table + ((sizetype)(((unsigned int)(i / 2)) * 16u)))->std::complex<double>::real()

Под этим есть информация о многих кандидатах, которые не могут преобразовать аргумент из двойного.

Так что я могу сделать, чтобы запустить его со стандартом C ++ 11?

1

Решение

http://en.cppreference.com/w/cpp/numeric/complex/imag

Ни одна из этих возвращаемых ссылок, следовательно, значение не lvalue, а rvalue (я полагаю), и вы не можете присвоить rvalue (представьте себе запись dane >> 5;Тоже самое дело. Вам придется читать во временную переменную, а затем, в зависимости от того, я или вы будете писать в real или же imag,

(Пример написания: table[i /2].real(myTemporaryVariable);)

Редактировать:

Рабочая функция:

template <typename T> void load(char name[], complex<T> table[], int len) {

ifstream dane;
dane.open(name);

for (int i = 0; i < 2 * len; i++)
{
double read;

dane >> read;

if (!(i%2)) table[i / 2].real(read);
else        table[(i - 1) / 2].imag(read);
}

dane.close();

}

Также я понятия не имею, почему он компилируется с -std = c ++ 99

1

Другие решения

С C ++ 11 real () и imag () члены std :: complex стали constexpr, что подразумевает const. Поэтому для них больше нет оператора >>. Увидеть http://en.cppreference.com/w/cpp/numeric/complex/imag для спецификации. Я не понимаю, как эта конструкция может работать в C ++ 11.

1

По вопросам рекламы [email protected]