适用于ios_base类的C ++ Undeclared标识符

时间:2015-12-07 18:52:25

标签: c++ visual-studio-2010 visual-studio-2012 visual-studio-2015 iosfwd

我有以下头文件。这在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 \ xiosbase”中的类ios_base(以前是“c:\ Program Files(x86)\ Microsoft” Visual Studio 12.0 \ VC \ include \ xiosbase“)。错误都是

  

严重级代码描述项目文件行抑制状态   错误C2065'flolandfield':未声明的标识符MyProject F:\ MyProject \ src \ utility \ ios_state.h 51

     

严重级代码描述项目文件行抑制状态   错误C2653'ioos_base':不是类或命名空间名称MyProject F:\ MyProject \ src \ utility \ ios_state.h 51

和同一行上的其他21人抱怨ios_base是未声明的标识符。

我很困惑为什么会出现这种情况,这是由于参考文献含糊不清吗?如果没有,为什么我会收到此错误,我该如何解决?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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