标准::字符串数组的初始值设定项太多

too many initializers for std::string array

本文关键字:太多 字符串 数组 标准      更新时间:2023-10-16

MEA CULPA:

好吧,我错了。 我找到了 VarInfo::m_datatypeName[] 的声明,它是 VarInfo::m_datatypeName[9]。 是的,硬编码。 我向所有为我挠头的人道歉。


我收到此错误:

too many initializers for 'std::string[9]'

对于此声明:

std::string       VarInfo::m_datatypeName[]  = { "", "STRING", "TIME", "MACADDRESS", "IPADDRESS", "STRINGSET", "SET", "UINT32", "INT32", "BOOL" };

新信息:

注意:声明中没有9或10。 如果分配列表中的项目不超过九个,则工作正常。 问题是第 10 项。

结束新信息:

我有一个模糊的记忆,一个 std::string 声明为一些默认数量的字符预先分配空间,所以我想怀疑字符串数组的类似行为。

所以,这里有一个问题。 我应该如何正确声明这一点? 希望不必硬性声明m_datatypenames的大小?

std::string m_datatypeName[9]

应该是

std::string m_datatypeName[10]

"", "STRING", "TIME", "MACADDRESS", "IPADDRESS", "STRINGSET", "SET", "UINT32", "INT32", "BOOL"最多 10 个值加起来。

将其声明为:

std::string m_datatypeName[10];

因为有十个字符串用于初始化数组,而不是九个。

如果要避免指定元素的数量,可以使用std::vector<std::string>

struct VarInfo
{
    static std::vector<std::string> m_datatypeName;
};

如果 C++11,您可以使用初始值设定项大括号(http://ideone.com/mGS9H 演示):

std::vector<std::string> VarInfo::m_datatypeName
    {
        "", "STRING", "TIME", "MACADDRESS", "IPADDRESS",
        "STRINGSET", "SET", "UINT32", "INT32", "BOOL"
    };  

或者,如果不是C++11,您可以使用boost::assign::list_of

#include <boost/assign/list_of.hpp>
std::vector<std::string> VarInfo::m_datatypeName =
    boost::assign::list_of
        ("")("STRING")("TIME")("MACADDRESS")("IPADDRESS")
        ("STRINGSET")("SET")("UINT32")("INT32")("BOOL");

你为一个std::string[9]提供了 10 个参数。

我有一个模糊的记忆,一个std::string声明 为一些默认数量的字符预分配空间,所以我想要 怀疑字符串数组的类似行为。

呃,没有。 T[]的行为完全相同,无论T类型如何。如果您不想使用std::vector则必须对数组中的数字进行硬编码。