6

この不可解なエラーメッセージはわかりませんが、

`'value_type' : is not a member of 'TextFileLineBuffer'` 

次のコードをVC++6でコンパイルし、//***行にコメントを付けなかったとき。

もちろん、コメントアウトすれば、問題なくコンパイルされます。

私はこの2時間、無駄にさまざまな試みを試みたと思います。任意のヒントをいただければ幸いです。

#include <list>
#include <string>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>

//wrapper for a string line
struct TextLine
{
    std::string m_sLineContent;
    operator std::string const& () const { return m_sLineContent; }
    friend std::istream& operator>>(std::istream& stream, TextLine& line)
    {
        return std::getline(stream, line.m_sLineContent);
    }
};

//this is a version of fixed size of string queue for easy text file reading
class TextFileLineBuffer
{
    public:
        TextFileLineBuffer(size_t lc, const char* fileName)
            : m_iLineCount(lc), m_sFileName(fileName)
        {
            std::ifstream   file(fileName);
            //***   std::copy(std::istream_iterator<TextLine>(file), 
            //***           std::istream_iterator<TextLine>(),
            //***           std::back_inserter(*this));
        }
        void push_back(std::string const& line)
        {
            m_sBuffer.insert(m_sBuffer.end(),line);
            if (m_sBuffer.size() > m_iLineCount)
            {
                m_sBuffer.erase(m_sBuffer.begin());
            }
        }
        const char* c_str() const
        {
            std::string returnValue("");
            for (const_iterator it = begin(); it != end(); ++it) 
            {
                returnValue = returnValue + *it;
            }
            return returnValue.c_str();
        }
        typedef std::list<std::string>          Container;
        typedef Container::const_iterator       const_iterator;
        typedef Container::const_reference      const_reference;

        const_iterator begin()  const       { return m_sBuffer.begin(); }
        const_iterator end()    const       { return m_sBuffer.end();}

    private:
        size_t                      m_iLineCount;
        std::list<std::string>      m_sBuffer;
        std::string                 m_sFileName;
};    
4

2 に答える 2

7

標準(24.5.2.1 [back.insert.iterator])によると、型にtypedefが含まれているback_insert_iterator必要があります。これは、(const参照または右辺値参照)引数の基本型に次の名前を付ける必要があります。Containervalue_typepush_back

class TextFileLineBuffer
{
public:
    // ...
    typedef std::string value_type;

C ++ 98との互換性のために、std :: back_inserterごとに、古いGCCでconst_referenceが必要であることも定義する必要がありconst_referenceます。なんで?

    typedef const std::string &const_reference;
于 2012-09-26T15:46:12.693 に答える
1

私はこれをやろうとしていたので、ここで自分の道を見つけました:

std::vector<Type_A, Type_B> someVec;

私がこれをしたかったとき:

std::vector<std::pair<Type_A, Type_B>> someVec;

ケースが似ている場合は、stlコンテナの2番目のテンプレートタイプがメモリアロケータを指定することに注意してください。これには特定の要件があります。その1つは、を定義することvalue_typeです。

于 2017-03-26T20:29:55.957 に答える