2011-04-18 14 views
6

Sadece GCC 4.6.0'ı derledim ve döngü için aralık tabanlı olarak başlayan yeni özellikleri denemek istedim.
Değiştirmek istediğim ilk döngü, bir std :: işaretçisinin vektörünü yineliyordu. Yeni sözdizimini kullanmak için kodu değiştirdim, ancak derleme yapmadı.C++ 11 bir işaretçi vektörü için aralık tabanlı

Başka bir döngü için yerine geçmeyi denedim, std :: struct yapısındaydı ve mükemmel bir şekilde derlendi ve çalıştırıldı.

İşte size sorunumu göstermek için kısa bir test kodu: Ben (g ++ bir parametre olarak evet, vermek -std = C++ 0x) bunu derlemeye çalıştığınızda

#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; 
} 

, Bu hatayla birlikte ölür:
Çizgiler 27-30 çıkışını açıklarsam, sorun yok.

Neyi yanlış yapıyorum? İşaretçi referansı sözdizimini bildirmiyor mu?
Veya döngülere göre aralık tabanlı kullanılabilen, sınırlı türlerde bir sınırlama var mı?

Yardımlarınız için teşekkürler!

+1

PROBA Should Bly SO –

+2

@Doug: Agreed ... 'e taşınacak ve aynı zamanda sorunun küçük bir URL'ye sahip olmaktan ziyade kaynak kodu içermesi durumunda da yardımcı olacaktır. – jprete

cevap

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

Bu yanlış ... Eğer 'işaretçileri' yerine 'değerlerini' orada yineleme gerekiyordu düşünüyorum. (int*) tek başına bir ifadedir, bu yüzden int*& yapmalısınız (parantez olmadan, bir ifade - aka “tip adı değil”). Ben şahsen otomatik veya otomatik & kullanmayı tercih ederim.

Sen yapabilirsiniz:

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

veya

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

veya

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

veya genel kodunda

:

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

'için (auto * p: values)' da çalışır. – Sjoerd

0

Ben

+0

Sadece bir cevabın kabul edilmesi çok kötü. Sen de haklıydın, işaretçiler yerine değerler yazarken aptalcadım, ama Klaim'in yorumu daha detaylıydı ve hatayı parantez içinde gösterdi. Neyse, çok teşekkür ederim! – torokati44

İlgili konular