【问题标题】:How to return a static const int std::array from a method?如何从方法返回静态 const int std::array?
【发布时间】:2018-03-19 19:50:17
【问题描述】:

我试图从一个函数返回一个常量 int std::array,但我遇到了错误,我不知道如何修复它们。

这些来自refmatrix 的值永远不应更改。这就是我使用常量 int 的原因。

reference.h

#include <array>
#include <iostream>

using namespace std;

class Reference {
public:
    static const size_t NCOLS = 3;
    static const size_t NBITS = 4;
    static const size_t NROWS = 4;

private:
    static array<array<array<const int, NBITS>, NCOLS>, NROWS> refmatrix;

public:
    Reference();
    ~Reference();

    array<const int, NBITS> smaller(int *arry);
};

reference.cpp

#include "reference.h"

array<array<array<const int, Reference::NBITS>, Reference::NCOLS>, Reference::NROWS> Reference::refmatrix = {{{{{0, 1, 2, 6}, {6, 4, 1, 7}, {6, 7, 8, 3}}}, 
                                                                                                              {{{7, 0, 5, 2}, {1, 6, 9, 3}, {1, 4, 8, 0}}}, 
                                                                                                              {{{9, 3, 4, 6}, {0, 7, 2, 8}, {5, 3, 9, 4}}}, 
                                                                                                              {{{8, 9, 1, 4}, {7, 2, 6, 0}, {4, 0, 3, 7}}}}};

Reference::Reference() {}
Reference::~Reference() {}

array<const int, Reference::NBITS> Reference::smaller(int *arry) {
    int j;

    for(int i=0; i < NROWS; i++){
        for(j=0; j < NCOLS; j++){
            if(refmatrix[i][0][j] != arry[j]){
                j = (NCOLS + 1);
            }
        }
        if(j == NCOLS){
            return refmatrix[i][1];
        }
    }
}

main.cpp

#include "reference.h"

int main() {
    Reference r;
    int arr[3] = {0, 1, 2};
    array<const int, Reference::NBITS> resp;

    resp = r.smaller( arr );

    // After get these values I will write it in a file.

    return 0;
}
main.cpp:在函数“int main()”中: main.cpp:6:37:错误:使用已删除的函数“std::array::array()” array resp; ^~~~ 在 reference.h:1:0 包含的文件中, 来自 main.cpp:1: /usr/include/c++/7.3.0/array:94:12:注意:'std::array::array()' 被隐式删除,因为默认定义格式不正确: 结构数组 ^~~~~ /usr/include/c++/7.3.0/array:94:12: 错误:‘struct std::array’中未初始化的 const 成员 /usr/include/c++/7.3.0/array:110:56: 注意: 'const int std::array::_M_elems [4]' 应该被初始化 类型名 _AT_Type::_Type _M_elems; ^~~~~~~~ main.cpp:9:33:错误:使用已删除的函数 'std::array& std::array::operator=(std::array&&)' resp = r.smaller(arr); ^ 在 reference.h:1:0 包含的文件中, 来自 main.cpp:1: /usr/include/c++/7.3.0/array:94:12: 注意:'std::array& std::array::operator=(std::array &&)' 被隐式删除,因为默认定义格式不正确: 结构数组 ^~~~~ /usr/include/c++/7.3.0/array:94:12: 错误:非静态 const 成员 'const int std::array::_M_elems [4]',不能使用默认值赋值运算符

【问题讨论】:

  • 阅读错误消息并查看它指向的代码。问题与返回数组无关。
  • 您不能稍后将const int 分配给std::array 元素,就像您不能将const int i; i = 123; 一样
  • 如果我将 main.cpp 更改为 array resp;
  • 在 2 个不同部分标记一个类的公共成员是灾难应用程序的秘诀
  • “标签”和“2 个不同的部分”是什么意思?对不起我的英语。

标签: c++ arrays c++11


【解决方案1】:

该错误与返回std::array 无关。这与分配给const有关。

您需要通过调用初始化resp,而不是默认初始化然后分配。

int main() {
    Reference r;
    int arr[3] = {0, 1, 2};
    array<const int, Reference::NBITS> resp = r.smaller( arr );

    // After get these values I will write it in a file.

    return 0;
}

See it live

【讨论】:

    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多