3

我正在按照这个YouTube 视频教程系列尝试一个 c++11 数组。虽然我在使用 IDE 方面不是很熟练,但我的 IDE、Eclipse 和 Codeblocks 都设置为让编译器遵循 C++0x ISO 语言标准 [-std=c++0x],这至少允许它们了解 c++11 数组的语法,例如array <double, 5> rainfall; 两者都以相同的方式响应。我编写的以下代码将此数组传递给将其打印出来的函数。

#include <iostream>
#include <array>

using namespace std;

void printArray(double[], int);

int main()
{
    array <double, 5> rainfall;

    rainfall[0] = 2.3;
    rainfall[1] = 0.3;
    rainfall[2] = 0.0;
    rainfall[3] = 4.1;
    rainfall[4] = 0.5;

    printArray(rainfall, 5);

    return 0;
}

void printArray(double array[], int size)
{
    for(int i = 0; i < size; i++)
    {
        cout << array[i] << " | ";
    }
}

使用非 c++11 数组,例如double rainfall[5]这样可以正常工作,但array <double, 5> rainfall出现错误,显示cannot convert 'std::array<double, 5u>' to 'double*' for argument '1' to 'void printArray(double*, int) 我正在关注的视频使用相同的代码,但没有收到此错误。

4

3 回答 3

9

如您所见,在您使用的视频中,该人使用了一个静态的 c 样式数组,该数组可以隐式转换为 T* 但是您使用的是 c++11 数组,该数组没有隐式转换为静态数组. 虽然,C++11 的数组类具有方法数据,可让您直接访问基础数据,这将在您的情况下进行。

但在这种情况下,如果你想在 c++11 数组中使用该函数,你可以像这样进行重载:

template <typename T, size_t Size> void printArray(const std::array<T, Size>& arr);

这适用于任何尺寸,您不需要为尺寸传递另一个(不需要的)参数;)

于 2013-04-02T18:41:58.220 回答
4

你可以传递rainfall.data()给函数。Anstd::array<T, N>不能隐式转换为T[N]

于 2013-04-02T18:21:11.987 回答
2

或者您可以将函数定义为

void printArray (const array <double, 5>& myarray, int size)
于 2013-04-02T18:25:01.827 回答