匿名聚合中不允许构造函数,结构中的字符串

Joe*_*cio 6 c++ string struct

所以我一直在尝试创建和使用这个结构时出错。使用字符而不是字符串的结构有效,但我发现我将需要能够存储许多字母。使用下面这个小代码示例后,我收到此错误:

错误:成员 'std::__cxx11::string GraphNode::::c1' 不允许在匿名聚合字符串 c1 中使用构造函数;

#include <iostream>
    #include <cstdlib>
    #include <fstream>
    #include <functional>
    #include <queue>
    #include <vector>
    #include <string>
    #include <map>
    using namespace std;

    class Node
    {
    public:
        struct
        {
            string info;
            Node *next;
            int weight;
            bool activated;

        };
    };
Run Code Online (Sandbox Code Playgroud)

我更多的问题是,字符串不能在结构中使用吗?有没有不同的方式来声明这个或其他解决方法?

Jon*_*ely 5

此代码使用 C++ 语言的非标准扩展,GCC 在Unnamed Structure and Union Fields中对此进行了记录。GCC 的该功能实现不允许未命名的结构具有具有非平凡构造函数的成员。Clang 和 MSVC 显然支持类似的扩展,但有更自由的限制,因此std::string允许成员。

最好的解决方案是停止依赖非标准扩展,而只使用适用于任何地方的标准 C++。没有理由struct在您的示例中使用未命名,因此只需编写:

class Node
{
public:
    string info;
    Node *next;
    int weight;
    bool activated;
};
Run Code Online (Sandbox Code Playgroud)


Jes*_*ing 1

您的问题是 string 有一个用户声明的构造函数,在聚合(例如未命名的结构)中不允许使用该构造函数,因为它是非 POD 类型。如果您给该结构命名,它应该可以解决您的问题。例如,使其成为非聚合:

struct data
{
    ...
};

//or

struct
{
    ...
} data;
Run Code Online (Sandbox Code Playgroud)

这里很好地解释了什么是聚合、什么是聚合和 POD 以及它们如何/为何特殊?

或者如果你想将其保留为一个集合,你可以这样做

struct
{
    string* info; //change to a pointer
    Node *next;
    int weight;
    bool activated;
};
Run Code Online (Sandbox Code Playgroud)

不过,我绝不是聚合或 POD 方面的专家,所以有人可以随时纠正我