2014-12-10 4 views
-1

나는이 책을 사용하여 조건 연산자에 대해 배우고있다 "C++ 프라이머 5 판"나는 현재 시도하고 운동 4.21를 재생하지 :조건 연산자와 표준 : : cout을 다음과 같이 운동 읽기 4 장에 좋은

연습 4.21 : 조건 연산자를 사용하여 홀수 값을 가진 vector<int>의 요소를 찾고 각 요소의 값을 두 배로하는 프로그램을 작성하십시오.

나는 조건부 연산자를 사용하여 벡터 "ivec"의 각 요소를 처리했습니다. 이 코드는 메모리에 주소를 출력하고 짝수를 저장한다고 가정합니다. std::cout << &ivec << " holds an even number";이 코드는 메모리에 주소를 출력하고 짝수를 저장한다고 가정합니다. 그러나 나는 아래의 오류가 발생합니다.

오류 수신 : 참조 할 수 없습니다. 삭제 된 기능입니다. 내 코드에 오류가 왜 사람이 설명 할 수 2,013

1) 표현 VB : 오류가 15

컴파일러를 사용할 줄에 std::cout로 다스 려한다?

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; 

, 우리는 표현 (is_odd) ? 2 : 1의 값에 의해 p1을 곱된다 - 그리고 그 표현의 유형은 모두 1 때문에 (int입니다 2int 유형입니다.

의도 한 효과가 있으려면 p1을 참조로 설정해야합니다. 그렇지 않으면 벡터의 요소에 영향을 미치지 않습니다.