簡體   English   中英

C++11 基於指針向量的范圍

[英]C++11 range-based for on a vector of pointers

我剛剛編譯了 GCC 4.6.0,我想嘗試新功能,從基於范圍的 for 循環開始。
我想改變的第一個循環是在指針的 std::vector 上迭代。 我更改了代碼以使用新語法,但它沒有編譯。

我試圖替換另一個 for 循環,它位於結構的 std::vector 上,並且它編譯並運行得很好。

這是一個簡短的測試代碼,向您展示我的問題:

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

當我嘗試編譯它時(是的,我將 -std=c++0x 作為參數提供給 g++) ,它會因以下錯誤而死:

main.cpp|27|錯誤:在嵌套名稱說明符中找到“:”,應為“::”

如果我將第 27-30 行注釋掉,就可以了。

我究竟做錯了什么? 指針引用聲明語法不對嗎?
或者是否存在可以使用基於范圍的 for 循環的包含類型的限制?

for ((int*) &p : values)

這是錯誤的。 (int*)是一個單獨的表達式,所以你需要做int*& (沒有括號,這使得表達式 - 又名“不是類型名稱”)至少使其正確。 我個人更喜歡使用 auto 或 auto&。

你可以做 :

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

我認為您打算在那里迭代“指針”而不是“值”...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM