Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)



我正在学习Bjarne Stroustrup的书《编程-使用C++的原理和实践》。在他的书中,他要求包含"std_lib_facilities.h">

#ifndef H112
#define H112 020215L

#include<iostream>
#include<iomanip>
#include<fstream> 
#include<sstream> 
#include<cmath> 
#include<cstdlib> 
#include<string> 
#include<list>
#include <forward_list>
#include<vector> 
#include<unordered_map>
#include<algorithm>
#include <array>
#include <regex>
#include<random>
#include<stdexcept>
//------------------------------------------------------------------------------
#if __GNUC__ && __GNUC__ < 5
inline ios_base & defaultfloat(ios_base& b)    // to augment fixed and scientific as in C++11
{
b.setf(ios_base::fmtflags(0), ios_base::floatfield);
return b;
}
#endif

Xcode不会编译我的项目并显示错误

  • 此部分中的未知类型名称

  • 未知的类型名称"ios_base";你是说std::ios_base吗?将"ios_base'"替换为"std::ios_base">

inline ios_base & defaultfloat(ios_base& b)    

还显示错误

使用未声明的标识符'ios_base';你是说std::ios_base吗?

b.setf(ios_base::fmtflags(0), ios_base::floatfield);

所以我把所有ios_base都改成了std::ios_base但它仍然不会编译我的项目。。。。

这似乎是文件中的一个错误。该部分是"最近"添加的内容,应仅在版本5之前的GCC版本下运行,但ios_base在using指令之前使用了非限定的

"正确"的解决方案是用std:::限定ios_base的所有使用

inline std::ios_base & defaultfloat(std::ios_base& b)
{
b.setf(std::ios_base::fmtflags(0), std::ios_base::floatfield);
return b;
}

或者,您可以将using namespace std;语句向上移动到文件中的代码段之前。这不是一个很好的解决方案,但Bjarne使用这个头的目的不是展示良好的编码实践,而是向初学者隐藏一些复杂性。

在任何情况下,只要你已经取得了足够的进展,你就应该完全停止使用标题,并正确地。书告诉你什么时候。

T@ravnsgaard作为一名自学成才的学生,一段时间以来一直在寻找解决这个标题问题的方法。只要我在编译过程中引用了C++11,这个解决方案就一直有效:例如g++-std=c++11您的文件.cpp-o您的文件

最新更新