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