Bjarne Stroustrup图书-std_lib_facilities.h-无法使用(类型名称未知)

时间:2018-10-30 09:02:31

标签: c++ ios xcode

我正在从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 但是它仍然无法编译我的项目。...

2 个答案:

答案 0 :(得分:2)

似乎是文件中的错误。该部分是“最近的”补充,仅应在版本5之前的GCC版本下运行,但是AttributeError: 'Map' object has no attribute 'Marker'在using指令之前的 中不加限定地使用。

“正确”的解决方法是将ios_base的所有使用与ios_base进行限定:

std::

或者,您可以将inline std::ios_base & defaultfloat(std::ios_base& b) { b.setf(std::ios_base::fmtflags(0), std::ios_base::floatfield); return b; } 语句上移到文件中的代码片段之前。这不是一个很好的解决方案,但是Bjarne提出此标头的目的不是演示良好的编码实践,而是向初学者隐藏一些复杂性。

无论如何,只要进度足够快,就应该完全停止使用标头,并正确进行操作。这本书告诉你什么时候。

答案 1 :(得分:1)

T @ravnsgaard 自学成才的学生一直在寻找解决此标头问题的方法。只要在编译过程中引用了C ++ 11,该解决方案就可以工作: 例如g ++ -std = c ++ 11 yourfile.cpp -o yourfile