2011-04-18 4 views
6

방금 ​​GCC 4.6.0을 컴파일 했으므로 범위 기반 for 루프부터 시작하여 새로운 기능을 사용하려고했습니다.
내가 바꾸고 싶은 첫 번째 루프는 포인터의 벡터를 반복하는 것이 었습니다. 새로운 구문을 사용하도록 코드를 변경했지만 컴파일되지 않았습니다.포인터의 벡터에서 C++ 11 범위 기반을 사용하는 경우

다른 루프를 대체하려고했습니다. 구조체의 std :: vector에 있었고 컴파일되어 완벽하게 실행되었습니다.

여기 당신이 내 문제를 보여주기 위해 간단한 테스트 코드입니다 : 내가 (g ++에 매개 변수로 그래, 난 줄 -std = C + +0)이 를 컴파일 할 때

#include <vector> 
#include <iostream> 

int main() 
{ 
    std::vector<int> values; 

    values.push_back(2); 
    values.push_back(5); 
    values.push_back(8); 
    values.push_back(13); 
    values.push_back(17); 

    for (int &n : values) 
    { 
     std::cout << n << "\n"; 
    } 

    std::vector< int* > pointers; 

    pointers.push_back(new int(2)); 
    pointers.push_back(new int(5)); 
    pointers.push_back(new int(8)); 
    pointers.push_back(new int(13)); 
    pointers.push_back(new int(17)); 

    for ((int*) &p : values) 
    { 
     std::cout << (*p) << "\n"; 
    } 

    for(unsigned int i = 0; i < pointers.size(); ++i) 
    { 
     delete pointers[i]; 
    } 

    return 0; 
} 

을, 이 오류로 사망합니다.
main.cpp|27|error: found ‘:’ in nested-name-specifier, expected ‘::’
27-30 행을 주석 처리하면 정상입니다.

내가 뭘 잘못하고 있니? 포인터 참조가 구문을 올바르게 선언하지 않습니까?
범위 기반 for 루프를 사용할 수있는 포함 된 유형의 제한이 있습니까?

도움 주셔서 감사합니다.

+1

proba해야을 콩을 SO –

+2

@Doug로 옮길 것 : 동의했다. ... 작은 URL을 가지고있는 것보다 소스 코드를 포함시키는 것이 도움이 될 것이다. – jprete

답변

13
for ((int*) &p : values) 

이것은 잘못된 것입니다 ... 당신은 '포인터'대신 '값'이 반복하는 의미 생각합니다. (int*)은 표현식 일 뿐이므로 적어도 올바른 것으로 만들기 위해 int*& (괄호 없음, 표현식 - 일명 "유형 이름 아님")을 수행해야합니다. 개인적으로 자동차 또는 자동 &을 사용하는 것을 선호합니다.

당신은 할 수 있습니다 :

for (auto p : values) // here p is a pointer, a copy of each pointer 

또는

for (auto& p : values) // here p is a non-const reference to a pointer 

또는

for (int* p : values) // here p is a copy of each pointer 

또는 일반 코드에서

:

for (auto&& p: values) // p is either a const reference to what is in values, or a non-const reference, depends on the context 
+2

'for (auto * p : values)'도 작동합니다. – Sjoerd

0

나는

+0

한 가지 대답 만 받아 들일 수 있다는 것이 나쁘다. 당신도 옳았어요. 포인터 대신 값을 쓰는 건 어리석은 짓 이었지만, 클레이 엄의 코멘트는 더 자세하고 괄호로 오류를 보여 줬어요. 어쨌든, 대단히 감사합니다! – torokati44