gpt4 book ai didi

c++ - 包含 似乎会导致命名空间问题?

转载 作者:行者123 更新时间:2023-11-30 04:27:54 24 4
gpt4 key购买 nike

我试图理解为什么包含 iosfwd 会导致包含标准字符串的输出流不起作用。

// hc_list.h file
#ifndef HC_LIST_H
#define HC_LIST_H

#include <cstdlib>
#include <iosfwd> // including this file makes the output operator throw errors
#include <list>

template <typename T>
class hcList
{
private:
std::list<T> selfList ; // a single internal STL list to hold the values

public:
hcList(void) {} ;
~hcList(void){} ;
template <typename U> friend std::ostream& operator<<(std::ostream &, const hcList<U> &) ;
} ;

template <typename U>
std::ostream& operator<<(std::ostream &out, const hcList<U> &outList)
{
out << "test" << std::endl ; // this line throws two errors, stated below
return out ;
}
#endif // HC_LIST_H

这段代码包含在main.cpp文件中,其中main函数如下:

// main.cpp file
#include <iostream>
#include "hc_list.h"
int main()
{
std::cout << "Begin Test" << std::endl;
return 0;
}

为了实际使用此代码并生成错误,需要一个包含列表头文件的空 cpp 文件。

// anyNamedFile.cpp file
#include "hc_list.h"

当我尝试编译时,我收到以下错误:

error: no match for 'operator<<' in 'out<< "test"'
error: 'endl' is not a part of 'std'

是什么导致 std 命名空间搞砸了,不再允许我输出字符串?

最佳答案

这里有两个问题。第一个问题是您正在使用 std::endl , 但这是在 <ostream> 中定义的, 这不包括在内。

第二个问题是您只包含标题 <iosfwd> ,它向前声明了许多 iostream 类型。前向声明让编译器知道类型存在。但是,您正在尝试使用这些类型的功能。既然你这样做了,你应该包括 <ostream> , 而不是 <iosfwd> . <ostream>包含 std::endl ,所以它应该处理所有事情。

关于c++ - 包含 <iosfwd> 似乎会导致命名空间问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10565550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com