簡體   English   中英

實現自定義(字符串)流時,Xcode 4.5.2 libc ++ std :: bad_cast

[英]Xcode 4.5.2 libc++ std::bad_cast when implementing custom (string)stream

我在使用char16_t作為char類型實現我自己的自定義stringbuf和stringstream時遇到問題。 作為測試,我使用了nullstringbuf和nullstringstream,我在舊的,可能是過時的C ++手冊中找到了。 此nullstringstream充當“/ dev / null”並且是一個簡單的實現。
當我使用<char>時,這個簡單的null流正在工作,但是當我使用<char16_t>時,它失敗並帶有std :: bad_cast異常。 我知道必須有一個char_traits<char16_t>可用,但libc ++似乎有它存在。

     class nullstringbuf : public std::basic_stringbuf<char16_t>
     {
     public:
        nullstringbuf( )
        {
           setp(0,0);
           setg(0,0,0);
        }


        virtual ~nullstringbuf()
        {

        }

        virtual int_type underflow()
        {
           setg(0,0,0);
           return traits_type::eof();
        }


        virtual int overflow(int c)
        {
           setp(0,0);
           if ( c==traits_type::eof() )
              return 0;

           return c;
        }


     };



     class nullstringstream : virtual public std::basic_stringstream<char16_t>
     {
     public:
        // Constructor(s)
        nullstringstream(std::ios_base::openmode om = std::ios_base::out | std::ios_base::in)
        : std::basic_stringstream<char16_t>(om)
        {
           init(&m_StreamBuf);
        }

        nullstringstream(base::xstring const& val, std::ios_base::openmode om = std::ios_base::out | std::ios_base::in)
        : std::basic_stringstream<char16_t>(val, om)
        {
           init(&m_StreamBuf);
        }

        // Destructor
        virtual ~nullstringstream()
        {

        }


        nullstringbuf* rdbuf()
        {
           return &m_StreamBuf;
        }

        std::basic_string<char16_t> str() const
        {
           return m_StreamBuf.str();
        }

     private:
        nullstringbuf           m_StreamBuf;

        nullstringstream(nullstringstream const &); // do NOT implement!
        nullstringstream& operator=(nullstringstream const &); // do NOT implement!
     };

為了編譯它我還需要專門化std::ctype<char16_t>

我的問題?:

  • 除了std :: ctype / std :: basic_stringbuf / std :: basic_stringstream之外,我還需要實現或專門化更多的類或模板嗎?
  • 有沒有其他人使用libc ++,char16_t和iostreams同樣的問題?

謝謝你的幫助。

使用不太容易支持的流類型實例化IOStream需要的不僅僅是實例化它並提供std::char_traits<cT> 至少你還需要實例化一些方面:

  • std::ctype<cT>雖然不一定在許多上下文中使用。
  • 在格式化或解析任何數字類型時,將使用std::numpunct<cT>
  • 解析sny數字類型時需要std::num_get<cT>
  • 格式化任何數字類型時,將跳轉std::num_put<cT>
  • 如果你要使用文件流,你還需要提供std::codecvt<cT, char>

副手我認為這些是你需要的方面。 但是,我記得我需要做的事情比我認為必要的更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM