【问题标题】:Can't convert std::array to int?无法将 std::array 转换为 int?
【发布时间】:2016-08-14 00:56:51
【问题描述】:

我只是在学习 c++ 并试图理解数组。所以请原谅我对这里出了什么问题的无知。

#include <iostream>
#include <string>
#include <array>
using namespace std;

void readArray(int *readfile, int ArraySize){
    int Interator;
    for(Interator = 1; Interator < ArraySize; Interator++){
        cout << " " << readfile[Interator];
    }
}

int main(){
    std::array<int, 5> array2={{1, 2, 3, 4, 5}};
    readArray(array2, array2.end());
}

错误:无法将 'std::array' 转换为 'int*' for arg '1' to void 'readArray'

我该如何解决这个问题?

【问题讨论】:

  • 有很多错误,例如 readArray 使用指针作为第一个参数,并且您通过值而不是通过引用传递。 end() 指向数组的最后一项,而不是实际大小。

标签: c++ arrays c++11 stl


【解决方案1】:

您不能像编译器所说的那样将std::array 转换为int*。对于这种转换,您可以使用普通的旧数组:

void readArray(int *readfile, int ArraySize)
{
    int Interator;
    for(Interator = 0; Interator < ArraySize; Interator++)
    {
        cout << " " << readfile[Interator];
    }
}

int main()
{
    //std::array<int, 5> array2={{1, 2, 3, 4, 5}};
    int array2[] = {1, 2, 3, 4, 5};
    readArray(array2, 5);
}

另外,Interator 更改为从零开始。如果您需要std::array,请使用std::array::begin()std::array::begin()

void readArray2(const std::array<int, 5>& a)
{
    for (auto elem : a)
        cout << " " << elem;
}

int main()
{
    std::array<int, 5> array2={{1, 2, 3, 4, 5}};
    //int array2[] = {1, 2, 3, 4, 5};
    readArray2(array2);
}

【讨论】:

    【解决方案2】:

    只需浏览some reference 即可发现std::array 有一个T* data() 和一个constexpr size_type size(),可以而且应该用于此目的。

    但这是一个糟糕的解决方案。最好的解决方案是直接使用迭代器,例如:

    template <typename T> void readArray(const T& data) {
      for (const auto& element : data)
        cout << element;
    }
    
    std::array<int, 5> data1 = { 1, 2, 3, 4, 5};
    readArray(data1);
    std::vector<int> data2 = {1, 2, 3, 4, 5};
    readArray(data2);
    std::list<int> data3 = {1, 2, 3, 4, 5};
    readArray(data3);
    

    这会期望T 是具有适当beginend() 重载的类型。

    如果你尝试使用C解决方案,用C++11标记问题是没有意义的,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-10
      • 2020-04-05
      • 1970-01-01
      • 2016-06-10
      • 2021-12-26
      • 2012-05-23
      • 2018-05-25
      • 1970-01-01
      相关资源
      最近更新 更多