6

我不明白这个神秘的错误信息,但我得到了 30 个

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

当我在 VC++ 6 中编译以下代码//***且未注释行时。

当然,如果我把它注释掉,它编译得很好。

我想我在过去的两个小时里尝试了各种尝试都是徒劳的。任何提示将不胜感激。

#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]),back_insert_iterator要求您的Container类型包含value_typetypedef,该类型应将(常量引用或右值引用)参数的基本类型命名为push_back

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

为了与 C++98 兼容,您还应该在旧 GCC 上定义const_reference每个std::back_inserter 需要 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 容器的第二种模板化类型指定了内存分配器——它有特定的要求。其中之一是它定义了value_type.

于 2017-03-26T20:29:55.957 回答