我正在学习 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 不会编译我的项目并显示错误




inline ios_base & defaultfloat(ios_base& b)

并显示错误




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

所以我将所有 ios_base 更改为 std::ios_base
但它仍然不会编译我的项目......

最佳答案

这似乎是文件中的错误。该部分是“最近”添加的,它应该只在版本 5 之前的 GCC 版本下运行,但 ios_base 在 using-directive 之前未限定使用。

“正确”的解决方法是使用 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;
}

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

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

关于c++ - Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53060662/

10-13 09:07