1

文字列をareboost::uint64_tの内容に変換しようとしています。私が現在使用しているコードは次のとおりです。pvalue12345678901234567890

void setAttribute(EnumAttrTyoe pname, const void *pvalue) {
    if (pname == SESS_ID) {
        const char *raw_sess_id = reinterpret_cast<const char*>(pvalue);
        std::string str_sess_id(raw_sess_id);
        std::cout << "Trying to open session id: '" << str_sess_id << "'\n";
        m_session_id = boost::lexical_cast<unsigned long long>(str_sess_id);
    }
}

これは、「不適切なレキシカル キャスト: ソース タイプの値をターゲットとして解釈できませんでした」というメッセージで例外をスローします。代わりにこのコードを使用する場合:

void setAttribute(EnumAttrTyoe pname, const void *pvalue) {
    if (pname == SESS_ID) {
        const char *raw_sess_id = reinterpret_cast<const char*>(pvalue);
        std::string str_sess_id(raw_sess_id);
        std::stringstream ss;
        ss << raw_sess_id;
        ss >> m_session_id;
    }
}

通過しますが、 の値m_session_idは 0 です。 のフラグはまだチェックしていませんssが、失敗したことを知るために天才である必要はありません。今何をすべきか?

更新C++ 11は使用できません。コンパイラはVC ++ 2008で、バージョン1.43.0をブーストしています。

4

2 に答える 2

0

This code works for me:

#include <sstream>
#include <cstdint>
#include <iostream>

int main()
{
   std::stringstream ss;
   ss << "12345678901234567890";

   std::uint64_t n = 0;
   ss >> n;

   std::cout << n << "\n";
}

Output over at http://liveworkspace.org:

stdout: 12345678901234567890

于 2013-03-18T14:17:11.297 に答える
0

あなたの入力Cスタイルの文字列は、あなたが思っているものではないと思います。この使用法はboost::lexical_cast、ブースト 1.42 で機能します。

#include <iostream>
#include <boost/lexical_cast.hpp>
#include <boost/cstdint.hpp>

int main() {
   std::string s = "12345678901234567890";
   boost::uint64_t i = boost::lexical_cast<boost::uint64_t>(s);
   std::cout << i << '\n';
   return 0;
}

私の推測では、入力がゼロで終わっていないか、予期しない接尾辞が付いているか、UTF16 のような代替エンコーディングが使用されていると思われます。あるいは、文字列でさえないのかもしれません。

于 2013-03-18T15:39:48.667 に答える