2014-12-10 4 views
-1

Я учусь об операторе условия использования книги «C++ Primer 5-е издание» Я в настоящее время пытаюсь Exercise 4.21 в главе 4. Осуществление гласит:Состояние оператора и станд :: соиЬ не играет хороший

Упражнение 4.21: Напишите программу для использования условного оператора для поиска элементов в vector<int>, которые имеют нечетное значение и удваивают значение каждого такого элемента.

Я использовал оператор условия в диапазоне для обработки каждого элемента в векторе «ivec». Ошибка/ошибка возникает в части else (:) оператора условия при попытке std::cout << &ivec << " holds an even number"; Этот код должен распечатать адрес в памяти и указать, что он содержит четное число. Однако я получаю следующую ошибку.

Полученная ошибка: Нельзя ссылаться - это удаленная функция. ошибка отсылая к std::cout на линии 15.

Компилятор используется: VB экспресс 2013

1) Может кто-нибудь объяснить, почему мой код по ошибке?

2) Как я могу изменить код, чтобы исправить ошибку и заставить программу работать?

#include "stdafx.h" 
#include <iostream> 
#include <vector> 

int main(){ 
int i1; 
std::vector<int> ivec; 

while (std::cin >> i1){ ivec.push_back(i1); }; 

for (int p1 : ivec){ 
    int i2 = p1 % 2; 
    (i2 != 0) ? p1 *= 2 : std::cout << &ivec << " holds an even number"; 
    i2 = 0; 
} 

system("pause"); 
return 0; 
} 
+0

Из моего опыта VisualStudio (который, я полагаю, вы имеете в виду с «VB express 2013»), не имеет приятных понятных сообщений об ошибках. Возможно, вам стоит попробовать вместо clang ++, например [в качестве онлайн-компилятора] (http://coliru.stacked-crooked.com/a/9628bf94a6ba3a14). – dyp

+1

Итак, части после '?' И ':' должны быть одного и того же типа или неявно конвертируемыми в один и тот же тип, так как выражение '(a? B: c)' должно оцениваться одним типом. Ваши типы - 'int' и' std :: ostream & ', которые не конвертируются друг в друга. – PeterT

ответ

3

Условный оператор не должен рассматриваться как оператор if/else. Это не так. Это выражение со значением. Таким образом, он имеет тип. Этот тип определяется вторым и третьим подвыражениями (до и после двоеточия). Они должны быть конвертируемыми в общий тип.

В вашем случае:

(i2 != 0) ? p1 *= 2 : std::cout << &ivec << " holds an even number"; 

В левой части толстой кишки, у вас есть int (p1). И справа, у вас есть std::ostream (cout). Они не конвертируются в общий тип. Это источник вашей ошибки. Какой книга хочет, вероятно, больше вдоль линий что-то вроде этого:

bool is_odd = p1 % 2 == 1; 
p1 *= (is_odd) ? 2 : 1; 

Здесь мы умножая p1 значения выражения (is_odd) ? 2 : 1 - и типа этого выражения int (так как 1 и 2 - тип int).

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

Смежные вопросы