std :: string数组的初始化程序太多了

时间:2012-10-01 13:39:26

标签: c++ stdstring

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项。

END NEW INFORMATON:

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

所以,这是问题所在。我应该如何正确地宣布这个?希望不必硬声明m_datatypenames的大小?

4 个答案:

答案 0 :(得分:6)

std::string m_datatypeName[9]

应该是

std::string m_datatypeName[10]

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

答案 1 :(得分:3)

声明为:

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");

答案 2 :(得分:2)

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

答案 3 :(得分:0)

  

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

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

相关问题