слишком много инициализаторов для массива std :: string

МОЯ ВИНА:

Хорошо я ошибся Я нашел объявление 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" };

НОВАЯ ИНФОРМАЦИЯ:

NB: в заявлении нет ни 9, ни 10. Если в списке назначений не более девяти элементов, это работает просто отлично. Проблема в 10-м пункте.

КОНЕЦ НОВОЙ ИНФОРМАЦИИ:

У меня есть смутное воспоминание о том, что объявление std :: string предварительно выделяет пространство для некоторого количества символов по умолчанию, поэтому я хочу заподозрить подобное поведение для массива строк.

Итак, вот в чем вопрос. Как мне правильно заявить об этом? Надеюсь, без необходимости объявлять размер m_datatypenames?

0

Решение

std::string m_datatypeName[9]

должно быть

std::string m_datatypeName[10]

"", "STRING", "TIME", "MACADDRESS", "IPADDRESS", "STRINGSET", "SET", "UINT32", "INT32", "BOOL" добавить до 10 значений.

6

Другие решения

Объявите это как:

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

Вы даете 10 параметров для std::string[9],

2

У меня есть смутное воспоминание, что объявление std :: string
предварительно распределяет пространство для некоторого количества символов по умолчанию, поэтому я хочу
подозревать подобное поведение для массива строк.

Нет T[] ведет себя точно так же, независимо от того, какой тип T, Если вы не хотите использовать std::vector вам придется жестко закодировать номер в массиве.

0
По вопросам рекламы [email protected]