在C ++中所有带有字符串变量的静态类结构都没有对象

萨满888

必须以代码中描述的格式接收数据,但是问题在于字符串变量的操作。为避免错误该怎么办?

class Class1
{
public:
    Class1() = delete ;
    const static int x = 1;
    static struct ZZ {
        const static int z1 = 1;
        const static QString z2 = "word";
    } z;
};

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << Class1::z.z2;
    return a.exec();
}

错误:

class1.h:13: ошибка: in-class initialization of static data member 'const QString Class1::ZZ::z2' of non-literal type
         const static QString z2 = "word";
                              ^~
class1.h:13: ошибка: call to non-constexpr function 'QString::QString(const char*)'
         const static QString z2 = "word";
                                   ^~~~~~

来源github.com

舍夫

免责声明:

我的第一印象是,这个代码虐待classstruct什么namespace实际上是发明了。

也就是说,答案集中static在OPs代码中数据成员有关的技术问题


为了重现该问题,我制作了以下类似示例:

#include <iostream>
#include <string>

class Class1
{
public:
    Class1() = delete ;
    const static int x = 1;
    static struct ZZ {
        static const int z1 = 1;
        static const std::string z2 = "word";
    } z;
};

int main(int argc, char* argv[])
{
    std::cout << Class1::z.z2;
}

输出:

main.cpp:11:34: error: in-class initialization of static data member 'const string Class1::ZZ::z2' of non-literal type
   11 |         static const std::string z2 = "word";
      |                                  ^~
main.cpp:11:39: error: temporary of non-literal type 'const string' {aka 'const std::__cxx11::basic_string<char>'} in a constant expression
   11 |         static const std::string z2 = "word";
      |                                       ^~~~~~

在大肠杆菌上进行现场演示

恕我直言,这已经足够接近OP的问题。

TL; DR:问题在于static成员变量必须明确定义(非内联)或标记为inline

因此,我的修复将如下所示:

#include <iostream>
#include <string>

class Class1
{
public:
    Class1() = delete ;
    const static int x = 1;
    inline static struct ZZ {
        static const int z1 = 1;
        inline static const std::string z2 = "word";
    } z = ZZ{};
};

int main(int argc, char* argv[])
{
    std::cout << Class1::x << '\n'
      << Class1::z.z1 << '\n'
      << Class1::z.z2 << '\n';
}

输出:

1
1
word

在大肠杆菌上进行现场演示

注意:

虽然inline是必要的struct ZZstd::string,它可以被排除在外的整数类型。因此,static const int z1 = 1;将被接受而不会产生任何投诉(不带前缀inline)。

进一步阅读:

cppreference.com上的静态数据成员


为了进行比较,相同的代码可以在没有inline以下代码的情况下工作

#include <iostream>
#include <string>

class Class1
{
public:
    Class1() = delete ;
    const static int x = 1;
    static struct ZZ {
        static const int z1 = 1;
        static const std::string z2;
    } z;
};

//Class1::ZZ Class1::z;
const std::string Class1::ZZ::z2 = "word";

int main(int argc, char* argv[])
{
    std::cout << Class1::x << '\n'
      << Class1::z.z1 << '\n'
      << Class1::z.z2 << '\n';
}

输出:

1
1
word

在大肠杆菌上进行现场演示

注意:

关于const Class1::ZZ Class1::z;,我不太确定。缺少的定义可能会被遗漏,因为Class1::z它从未使用过。

为了验证这一点,我再次修改了示例:

#include <iostream>
#include <string>

class Class1
{
public:
    Class1() = delete ;
    const static int x = 1;
    static struct ZZ {
        static const int z1 = 1;
        static const std::string z2;
    } z;
};

Class1::ZZ Class1::z;
const std::string Class1::ZZ::z2 = "word";

std::ostream& operator << (std::ostream &out, const Class1::ZZ &z)
{
  return out << z.z1 << ", " << z.z2;
}

int main(int argc, char* argv[])
{
    std::cout << Class1::x << '\n'
      << Class1::z << '\n'
      << Class1::z.z1 << '\n'
      << Class1::z.z2 << '\n';
}

输出:

1
1, word
1
word

在大肠杆菌上进行现场演示

注意:

注释Class1::z(如前面的示例中)的定义会导致链接错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C++ 中的反射 - 打印类中所有定义的字符串

来自分类Dev

计算字符串C#中所有子字符串的出现次数

来自分类Dev

C程序删除字符串中所有重复的字符

来自分类Dev

C-使用printf原始打印字符串中所有不可打印的字符

来自分类Dev

动态调用向量中所有对象的C ++类成员

来自分类Dev

C# 获取一个单词在长字符串中所有出现的所有内容

来自分类Dev

C#查找带有模式的大字符串中的所有子字符串

来自分类Dev

“带有char的字符串:” +'c“比”带有char的字符串:“ +” c“更好或更差?

来自分类Dev

C ++中所有内容的基类

来自分类Dev

有没有简单的方法可以将枚举类转换为字符串(C ++)?

来自分类Dev

登录C打印到stdout和stderr都没有重复

来自分类Dev

自定义C#按钮单击任何想法时什么都没有?

来自分类Dev

protoc-c:带有可选字符串的嵌套结构抛出seg错误

来自分类Dev

在C#代码中使用带有字符串[255]类型和结构的Delphi DLL

来自分类Dev

将带有动态字符串的结构复制到缓冲区c

来自分类Dev

如何使用C中的整数对带有字符串的结构进行排序?

来自分类Dev

如何在C中将字符串数组与整数数组并行排序?没有结构?

来自分类Dev

如何将带有字符串变量的字符串传递给C ++中的函数

来自分类Dev

带有字符串和shared_ptr的并集的C ++ 11类

来自分类Dev

带有引号和变量的C ++ MySQL查询字符串解析

来自分类Dev

具有C ++中所有同步方法的类

来自分类Dev

C#字符串。对象args之前带有'+'的格式

来自分类Dev

无论如何,有没有将字符串转换为C ++ / Qt中的结构中的字段?

来自分类Dev

c#列出组合框中变量字符串中的所有匹配项

来自分类Dev

带有类列表的字符串连接 C#

来自分类Dev

C将字符串解析为没有定界符的单独变量?

来自分类Dev

为什么C和Objective-C都没有布尔值的格式说明符?

来自分类Dev

scanf和带有c字符串的strcmp

来自分类Dev

C-显示带有低宏的字符串

Related 相关文章

  1. 1

    C++ 中的反射 - 打印类中所有定义的字符串

  2. 2

    计算字符串C#中所有子字符串的出现次数

  3. 3

    C程序删除字符串中所有重复的字符

  4. 4

    C-使用printf原始打印字符串中所有不可打印的字符

  5. 5

    动态调用向量中所有对象的C ++类成员

  6. 6

    C# 获取一个单词在长字符串中所有出现的所有内容

  7. 7

    C#查找带有模式的大字符串中的所有子字符串

  8. 8

    “带有char的字符串:” +'c“比”带有char的字符串:“ +” c“更好或更差?

  9. 9

    C ++中所有内容的基类

  10. 10

    有没有简单的方法可以将枚举类转换为字符串(C ++)?

  11. 11

    登录C打印到stdout和stderr都没有重复

  12. 12

    自定义C#按钮单击任何想法时什么都没有?

  13. 13

    protoc-c:带有可选字符串的嵌套结构抛出seg错误

  14. 14

    在C#代码中使用带有字符串[255]类型和结构的Delphi DLL

  15. 15

    将带有动态字符串的结构复制到缓冲区c

  16. 16

    如何使用C中的整数对带有字符串的结构进行排序?

  17. 17

    如何在C中将字符串数组与整数数组并行排序?没有结构?

  18. 18

    如何将带有字符串变量的字符串传递给C ++中的函数

  19. 19

    带有字符串和shared_ptr的并集的C ++ 11类

  20. 20

    带有引号和变量的C ++ MySQL查询字符串解析

  21. 21

    具有C ++中所有同步方法的类

  22. 22

    C#字符串。对象args之前带有'+'的格式

  23. 23

    无论如何,有没有将字符串转换为C ++ / Qt中的结构中的字段?

  24. 24

    c#列出组合框中变量字符串中的所有匹配项

  25. 25

    带有类列表的字符串连接 C#

  26. 26

    C将字符串解析为没有定界符的单独变量?

  27. 27

    为什么C和Objective-C都没有布尔值的格式说明符?

  28. 28

    scanf和带有c字符串的strcmp

  29. 29

    C-显示带有低宏的字符串

热门标签

归档