我试图理解为什么包含 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 命名空间被搞砸并且不再允许我输出字符串?