所以我一直在尝试创建和使用这个结构时出错。使用字符而不是字符串的结构有效,但我发现我将需要能够存储许多字母。使用下面这个小代码示例后,我收到此错误:
错误:成员 '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)
我更多的问题是,字符串不能在结构中使用吗?有没有不同的方式来声明这个或其他解决方法?
此代码使用 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)
您的问题是 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 方面的专家,所以有人可以随时纠正我