ios_base类的C++未声明标识符

C++ Undeclared Identifier for ios_base Class

本文关键字:未声明 标识符 C++ 类的 base ios      更新时间:2023-10-16

我有以下头文件。这在VS2010和VS2013中编译良好,但现在在VS2015 中失败

#ifndef UTILITY_IOS_STATE_H
#define UTILITY_IOS_STATE_H
#include <iosfwd>
template <class Value>
struct SetPrecision
{
    SetPrecision(int precision, const Value& value) : _precision(precision), _value(value) {}
    const int _precision;
    const Value _value;
};
template <class Value>
inline SetPrecision<Value> precision(int precision, const Value& value) {
    return SetPrecision<Value>(precision, value);
}
template <class Value>
std::ostream& operator<<(std::ostream& out, const SetPrecision<Value>& p)
{
    std::streamsize precision = out.precision();
    out.precision(p._precision);
    out << p._value;
    out.precision(precision);
    return out;
}
template <class Value>
struct SetFixedPrecision
{
    SetFixedPrecision(int precision, const Value& value) : _precision(precision), _value(value) {}
    const int _precision;
    const Value _value;
};
template <class Value>
inline SetFixedPrecision<Value> fixedPrecision(int precision, const Value& value) {
    return SetFixedPrecision<Value>(precision, value);
}
template <class Value>
std::ostream& operator<<(std::ostream& out, const SetFixedPrecision<Value>& p)
{
    std::streamsize precision = out.precision();
    std::ios_base::fmtflags flags = out.flags();
    out.precision(p._precision);
    out.setf(ios_base::fixed, ios_base::floatfield);
    out << p._value;
    out.flags(flags);
    out.precision(precision);
    return out;
}
#endif  /* UTILITY_IOS_STATE_H */

违规的线路是:

out.setf(ios_base::fixed, ios_base::floatfield);

编译器错误都是关于"c:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\include\siosbase"中的类ios_base(以前是"c:\Program File(x86)\Microsoft Visual Studio 12.0\VC\include\siosbbase")。错误都是

严重性代码描述项目文件行禁止显示状态错误C2065"floatfield":未声明的标识符MyProject F:\MyProject\src\utility\ios_state.h 51

严重性代码描述项目文件行禁止显示状态错误C2653"ios_base":不是类或命名空间名称MyProject F:\MyProject\src\utility\ios_state.h 51

同一行的另外21人都抱怨ios_base是一个未声明的标识符。

我很困惑为什么会出现这种情况,这是因为参考文献中的歧义吗?如果没有,为什么会出现此错误,以及如何修复?

谢谢你抽出时间。

它需要是std::ios_base,就像函数中的其他ios_base引用一样。

不能只包含<iosfwd>,而不能使用流。发布的代码根本不应该编译。<iosfwd>仅用于流无类的引用,不支持插入器调用。对于您的代码,您应该包括<iostream>