错误消息:'value_type':不是其成员

时间:2012-09-26 15:33:02

标签: c++ stl

我不明白这个神秘的错误信息,但我得到了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;
};    

2 个答案:

答案 0 :(得分:6)

根据标准( 24.5.2.1 [back.insert.iterator] ),back_insert_iterator要求您的Container类型包含value_type typedef,应该将{const引用或右值引用)参数的基本类型命名为push_back

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

为了与C ++ 98兼容,您还应该按std::back_inserter needs const_reference on older GCC. Why?定义const_reference

    typedef const std::string &const_reference;

答案 1 :(得分:1)

我找到了我的路,因为我试图这样做:

std::vector<Type_A, Type_B> someVec;

当我想这样做时:

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

如果你的情况类似,请记住stl容器的第二个模板类型指定内存分配器 - 它有特殊要求。其中之一是它定义了value_type