【问题标题】:Error using range-based for loop - Eclipse CDT Luna使用基于范围的 for 循环时出错 - Eclipse CDT Luna
【发布时间】:2015-06-20 20:11:44
【问题描述】:

我是 C++ 编程的初学者。我尝试编写一个非常简单的程序,它结合了模板的使用、将数组作为参数传递给函数和基于范围的 for 循环。这是我使用 Eclipse Luna CDT 软件编写和编译的程序。

#include <iostream>
using namespace std;

template <typename T>
void display (T myArray[])
{
    int i = 1;
    for (T c : myArray)
    {
        cout << i << " element is " << c << endl;
        ++i;
    }
}

int main()
{
    int numArray[] {1, 2, 3};
    char charArray[] {'a', 'b', 'c'};

    display<int>(numArray);
    display<char>(charArray);

    return 0;
}

但是当我保存这个文件并构建它时,它说第 8 行有错误,突出显示基于范围的 for 循环。编译器明确指出“'begin' 和 'end' 未在此范围内声明”。编译器是 mingw-w64 并且已经为 C++11 设置。如何解决此错误?

谢谢你的回答。

【问题讨论】:

    标签: templates c++11 for-loop mingw eclipse-luna


    【解决方案1】:

    要使用基于范围的 for 循环,您需要使用 std::array 而不是 C 样式的数组。我修改了你的代码,所以它可以工作。请注意,您需要将 -std=c++11 标志传递给编译器。

    #include <array>
    #include <iostream>
    using namespace std;
    
    template <typename T>
    void display (T myArray)
    {
        int i = 1;
        for (auto c : myArray)
        {
            cout << i << " element is " << c << endl;
            ++i;
        }
    }
    
    int main()
    {
        std::array<int, 3> numArray {1, 2, 3};
        std::array<char, 3> charArray {'a', 'b', 'c'};
    
        display(numArray);
        display(charArray);
    
        return 0;
    }
    

    【讨论】:

    • 当我将您的更改添加到程序中时,它运行良好。你能告诉我为什么 C 风格的数组不起作用吗?是因为它与 C++11 的添加不兼容吗?非常感谢。
    • @RamSidharthNair 基于范围的 for 循环使用“开始”和“结束”迭代器。 C 风格的数组没有它们,所以你需要使用一个容器,例如std::array、std::vector 等
    • 我现在完全理解了。非常感谢。
    • @RamSidharthNair for 循环范围与 C 数组完美配合。你所说的“myArray”是一个指针。
    【解决方案2】:

    在 c++ 中,没有像 php 等其他语言那样的“for each”...

    所以你必须告诉函数数组在哪里结束,因为如果你给函数一个数组,它只会得到一个起始位置的指针......

    这应该适合你:

        #include <iostream>
    using namespace std;
    
    template <typename T>
    void display (T myArray[], int arraysize)
    {
        for (int i = 0; i < arraysize ;i++)
        {
            cout << i+1 << " element is " << myArray[i] << endl;
        }
    }
    
    int main()
    {
        int numArray[] = {1, 2, 3};
        char charArray[] = {'a', 'b', 'c'};
    
        display<int>(numArray, 3);
        display<char>(charArray, 3);
    
        return 0;
    

    【讨论】:

    • 看到 ranged for 语法我也很惊讶,但后来我用谷歌搜索发现直到 C++ 11 它确实存在于 C++ 中:en.cppreference.com/w/cpp/language/range-for
    • 在 C++11 中添加了基于范围的 for 循环。
    • 那么它可能会解决问题,不是给出数组的开始指针,而是给出数组的引用(如链接示例中所做的那样)?
    • 也许吧,但我真的不知道,因为我以前没有见过这种语法。关于示例 - 它演示的是迭代器而不是数组,所以我不确定数组的行为是什么。
    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 2016-04-03
    • 2014-12-06
    • 1970-01-01
    • 2017-11-04
    • 2018-12-28
    • 1970-01-01
    • 2014-01-12
    相关资源
    最近更新 更多