当前位置: 首页 > 知识库问答 >
问题:

静态std::array与结构包含std::字符串[重复]

乐欣可
2023-03-14

我试图创建一个查找表,以便轻松创建具有不同值的对象。为此,我需要在类中使用一个静态std::数组填充数据。目前看起来是这样的:

#include <iostream>

#include <array>
#include <string>

struct MyStruct{
    std::string s;
    int a;
    int b;
};

class Arr{
public:
    static constexpr std::array<MyStruct, 3> strArray{{{"a", 1,2}, {"b", 2,3}, {"c", 3,4}}};
};

constexpr std::array<MyStruct, 3> Arr::strArray;

int main()
{    
    for(auto i : Arr::a){
        std::cout << i << std::endl;
    }

    std::cout << "With a struct:\n";
    for(auto i : Arr::strArray){
        std::cout << i.a << ", " << i.b << std::endl;
    }



    return 0;
}

它工作正常,如果我删除std::字符串,但与std::字符串我得到编译错误

../staticArray/main.cpp:15:46: error: constexpr variable cannot have non-literal type 'const std::array<MyStruct, 3>'
    static constexpr std::array<MyStruct, 3> strArray{{{"a", 1,2}, {"b", 2,3}, {"c", 3,4}}};
                                             ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/array:137:16: note: 'array<MyStruct, 3>' is not literal because it has data member '__elems_' of non-literal type 'value_type [3]'
    value_type __elems_[_Size > 0 ? _Size : 1];
               ^
../staticArray/main.cpp:19:40: error: constexpr variable cannot have non-literal type 'const std::array<MyStruct, 3>'
constexpr std::array<MyStruct, 3> Arr::strArray;
                                       ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/array:137:16: note: 'array<MyStruct, 3>' is not literal because it has data member '__elems_' of non-literal type 'value_type [3]'
    value_type __elems_[_Size > 0 ? _Size : 1];

共有2个答案

葛奇
2023-03-14

(从注释部分迁移)

该错误表示字符串构造函数[none]都是[constexpr]。对于一种进行动态内存分配的类型,它们又如何呢?如果要使用std::string,则表不能是constepr(用户故事讲述者)

利俊迈
2023-03-14

在C17中,您可以使用std::string\u视图而不是std::string。http://coliru.stacked-crooked.com/a/946c48ee9f87a363

出于某种原因,尽管您不能使用只接受const char*(应该是可能的,因为它是constexpr)的构造函数(在string_视图中),但也需要传递length。

在C 11中也可以这样做,但是您必须自己使std::string_视图与类相似

 类似资料:
  • 两者之间有实际区别吗 和 ? 看起来包含常量元素的非常量数组仍然无法交换,赋值运算符也不起作用<我什么时候应该选择一个而不是另一个?

  • 我正在用Qt编写一个图像查看器。我试图在头文件中执行以下操作: 在源文件中: 然而,我得到了以下错误: 在非类类型int[10]的缩放中请求成员开始,在非类类型int[10]的缩放中请求成员结束 有人知道如何初始化这个静态const private成员吗?

  • 我不知道如何创建以下内容: 我总是得到 /usr/include/c/5.5.0/bits/stl_对。h:139:45:错误:使用已删除的函数'std::atomic::atomic(const std::atomic 我已经试过了 我知道std::atomic是不可复制的,那么你应该如何创建一对呢?难道这不可能吗?

  • 我已经执行了操作员的命令 头文件: cpp文件: 这对像这样的操作很有效 文件 ,但当用作 库特 结果有: 错误:无法将'std::ostream{aka std::basic_ostream}'左值绑定到'std::basic_ostream 编辑:替换为std::ostream