У меня есть следующий заголовочный файл. Это прекрасно скомпилировано в 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);
Все ошибки компилятора связаны с классом ios_base в «c: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ include \ xiosbase» (раньше это был «c: \ Program Files (x86) \ Microsoft Visual Studio 12.0». \ VC \ включить \ xiosbase «). Все ошибки
Код серьезности Описание Состояние подавления строки файла проекта
Ошибка 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>
,