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はありません。割り当てリストに9つ以下の項目がある場合、これは問題なく機能します。問題なのはアイテム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];

配列の初期化に使用されている文字列は9つではなく、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");
于 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 に答える