【问题标题】:Struct init: Braces around scalar initializer for type char**struct init:char 类型的标量初始化器周围的大括号**
【发布时间】:2018-09-13 19:44:02
【问题描述】:

我有这个结构:

struct NetDescriptor {
    unsigned int inputNeuronCount = 1;
    char **inputNeuronType = nullptr;
    unsigned int hiddenNeuronCount = 0;
    unsigned int *hiddenNeurons = nullptr;
    unsigned int outputNeuronCount = 1;
    char **outputNeuronType = nullptr;
};

并且想用这个代码在另一个类的方法中初始化它:

NetDescriptor nnDescriptor = {
    3,
    {"EAT\n","FOODL\n","FOODR\n"},
    3,
    {4,4,3},
    3,
    {"EAT\n","MOVEL\n","MOVER\n"}
};

但它只给我这个错误:

第 3 行:错误:用大括号括住类型“char**”的标量初始值设定项

我试过了:

{{"EAT\n"},{"FOODL\n"},{"FOODR\n"}},

但它并没有改变任何东西,我也尝试了 std::string 相同的结果。

【问题讨论】:

  • 大多数时候,如果你想要char **,你应该改用std::vector<std::string>
  • 嗯,是的。您将 inputNeuronType 声明为指针。指针是单个值;你不能用表达式列表来初始化它。
  • @melpomene 那么你有什么推荐的呢?我想在代码中定义这个结构静态而不是像 vec.push_back("EAT");
  • inputNeuronType 应该做什么?它真的需要是一个指针(指向另一个指针)吗?
  • @melpomene 不,我只想要一个包含 std::string 或 char* 字符串数组的结构,我想用 STRUCT = { {"1","2"," 3"}};或类似的东西。

标签: c++ pointers initialization


【解决方案1】:

我只想要一个包含字符串数组的结构 std::string 或 char* 我想用 STRUCT = { {"1","2","3"}};或类似的东西。

像这样?

#include <iostream>
#include <string>
#include <vector>

struct NetDescriptor
{
    char const *inputNeuronType[3];
};

struct NetDescriptorStr
{
    std::string inputNeuronType[3];
};

struct NetDescriptorDynamic
{
    std::vector<std::string> inputNeuronType;
};

int main()
{
    NetDescriptor nnDescriptor = { { "EAT\n","FOODL\n","FOODR\n" } };
    std::cout << nnDescriptor.inputNeuronType[1] << std::endl;

    NetDescriptorStr nnDescriptorStr = { { "EAT\n","FOODL\n","FOODR\n" } };
    std::cout << nnDescriptorStr.inputNeuronType[1] << std::endl;

    NetDescriptorDynamic nnDescriptorDynamic = { { "EAT\n","FOODL\n","FOODR\n","EAT\n","FOODL\n","FOODR\n" } };
    std::cout << nnDescriptorDynamic.inputNeuronType[4] << std::endl;

    NetDescriptorDynamic nnDescriptorDynamic2;
    nnDescriptorDynamic2.inputNeuronType.assign({ "EAT\n","FOODL\n","FOODR\n","EAT\n","FOODL\n","FOODR\n" });
    std::cout << nnDescriptorDynamic2.inputNeuronType[4] << std::endl;

}

【讨论】:

  • 这基本上是我的意思,但我也希望它是动态的,我只需要将“XYZ\n”添加到 struct init 而不是设置从 3 到 4 的任何值。所以我想指针将是解决方案?
  • 哦,非常感谢,我知道这是可能的!问题解决了。
【解决方案2】:

这个问题与结构本身无关。

char **inputNeuronType = {"foo", "bar", "baz"};

有同样的问题。

指针是单个值。您不能使用表达式列表来初始化它;你只能将它指向一些已经存在的数组。

但是,如果您真正需要的只是初始化语法,那么 std::vector&lt;std::string&gt; 就可以了:

#include <string>
#include <vector>

struct NetDescriptor {
    unsigned int inputNeuronCount = 1;
    std::vector<std::string> inputNeuronType;
    unsigned int hiddenNeuronCount = 0;
    std::vector<unsigned int> hiddenNeurons;
    unsigned int outputNeuronCount = 1;
    std::vector<std::string> outputNeuronType;
};

NetDescriptor nnDescriptor = {
    3,
    {"EAT\n","FOODL\n","FOODR\n"},
    3,
    {4,4,3},
    3,
    {"EAT\n","MOVEL\n","MOVER\n"}
};

此代码 Just Works™。

【讨论】:

  • 也为你:非常感谢!正是我的意思,思想向量只能为此使用 push_back...
  • @skilled-solutions 您可以使用assign 来维护格式,请参阅我的编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多