0

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 的大小?

4

4 回答 4

7
std::string m_datatypeName[9]

应该是

std::string m_datatypeName[10]

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

于 2012-10-01T13:40:20.937 回答
3

将其声明为:

std::string m_datatypeName[10];

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

如果你想避免指定元素的数量,你可以使用 a 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");
于 2012-10-01T13:41:21.527 回答
2

你给一个 10 个参数std::string[9]

于 2012-10-01T13:41:27.473 回答
0

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

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

于 2012-10-01T13:42:28.870 回答