C++ 错误消息:';值类型';:不属于

C++ 错误消息:';值类型';:不属于,c++,stl,C++,Stl,我不明白这个神秘的错误信息,但我收到了30封信 `'value_type' : is not a member of 'TextFileLineBuffer'` 当我在VC++6中编译以下代码时,/***行未注释 当然,如果我把它注释掉,它编译的很好 我想在过去的两个小时里,我尝试了各种各样的尝试,但都没有成功。 任何小费都将不胜感激 #include <list> #include <string> #include <iostream> #includ

我不明白这个神秘的错误信息,但我收到了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;
};    
#包括
#包括
#包括
#包括
#包括
#包括
//字符串行的包装器
结构文本行
{
std::字符串m_sLineContent;
运算符std::string const&()const{return m_sLineContent;}
friend std::istream&operator>>(std::istream&stream,文本行&行)
{
return std::getline(stream,line.m_sLineContent);
}
};
//这是一个固定大小的字符串队列版本,便于读取文本文件
类TextFileLineBuffer
{
公众:
TextFileLineBuffer(大小\u t lc,常量字符*文件名)
:m_iLineCount(lc),m_sFileName(文件名)
{
std::ifstream文件(文件名);
//***std::copy(std::istream_迭代器(文件),
//***std::istream_迭代器(),
//***标准::背面插入器(*此));
}
无效推回(标准::字符串常量和行)
{
m_sBuffer.insert(m_sBuffer.end(),第行);
if(m_sBuffer.size()>m_iLineCount)
{
m_sBuffer.erase(m_sBuffer.begin());
}
}
常量字符*c_str()常量
{
std::字符串返回值(“”);
for(常量迭代器it=begin();it!=end();+it)
{
returnValue=returnValue+*it;
}
返回returnValue.c_str();
}
typedef std::列表容器;
typedef容器::常量迭代器常量迭代器;
typedef容器::const_reference const_reference;
常量迭代器begin()常量{返回m_sBuffer.begin();}
常量迭代器end()常量{返回m_sBuffer.end();}
私人:
大小m_i记录;
标准:列表m_sBuffer;
std::字符串m_sFileName;
};    
根据标准(24.5.2.1[back.insert.iterator]),
back\u insert\u迭代器
要求您的
容器
类型包含一个
值类型
typedef,它应该将(const reference或rvalue reference)参数的基类型命名为
push\u-back

class TextFileLineBuffer
{
public:
    // ...
    typedef std::string value_type;
为了与C++98兼容,还应根据以下内容定义
const_reference


我在这里找到了自己的路,因为我正试图做到这一点:

std::vector<Type_A, Type_B> someVec;
std::vector<std::pair<Type_A, Type_B>> someVec;
std::vector someVec;
当我想这样做的时候:

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

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

它是否与非古代编译器一起工作?似乎是同一个问题。@LuchianGrigore你让我笑了,但是的,它在VS 2010中产生了同样的错误。