如何从方法返回静态 const int std::array?

Posted

技术标签:

【中文标题】如何从方法返回静态 const int std::array?【英文标题】:How to return a static const int std::array from a method? 【发布时间】: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 个不同的部分”是什么意思?对不起我的英语。 【参考方案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

【讨论】:

以上是关于如何从方法返回静态 const int std::array?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有编译器警告的情况下返回对空字符串的 const 引用?

返回 const std::string& 的方法应该返回 const std::string_view 吗?

使用 std::variant 的静态多态性

从 const 引用初始化非常量对象时防止复制

c++中出现 无法从“CString”转换为“const std::string”错误

如何从std :: map中检索所有键(或值)并将它们放入向量中?