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的大小?
答案 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
,则必须对数组中的数字进行硬编码。