0

我一直在迁移一些代码来更改标头的声明,因为它们不包含在我的 Ubuntu 环境中。我终于更改了所有文件,但收到以下错误:

Item.h:33: error: reference to ‘ostream’ is ambiguous
Item.h:16: error: candidates are: struct ostream
/usr/include/c++/4.4/iosfwd:130: error:                 typedef struct  
std::basic_ostream<char, std::char_traits<char> > std::ostream 
Item.h:33: error: ISO C++ forbids declaration of ‘ostream’ with no type
Item.h:33: error: ‘ostream’ is neither function nor member function; cannot be declared friend

代码如下:

class Item
{
public:
    Item( //const Wrd* hd,
     const Term * _term, int _start, int _finish );
    ~Item();
    int         operator== (const Item& item) const;
    friend ostream& operator<< ( ostream& os, const Item& item ); // <-- error

任何人都知道我将如何纠正这个问题?

4

3 回答 3

5

看起来在 Item.h 中有一行如下所示:

struct ostream;

你得到的问题是这ostream不是struct; 它是typedeffor basic_ostream<char>,因此您的自定义定义与在中前向声明ostream的标准定义相冲突。因此,当你写ostream<iosfwd>

friend ostream& operator<< ( ostream& os, const Item& item );

编译器无法判断ostream是指您的还是标准头文件导出struct ostream的更复杂的。typedef

要解决此问题,请找到您尝试转发声明的位置ostream并将其删除。相反,请考虑使用头文件<iosfwd>来导入对ostream.

更一般地说,您不应该尝试在标准库中前向声明任何内容。只是#include它的适当标题。

于 2011-03-20T19:38:48.653 回答
1

编译器会告诉你到底发生了什么:

有一个basic_ostream<char...>名为ostream(显然来自标准头文件)的模板专业化()的 typedef,并且struct ostream在您的代码中的其他地方有一个定义(您必须寻找并重命名/ramove)。因此模棱两可

于 2011-03-20T19:37:40.813 回答
0

你试过friend std::ostream& operator<< ...吗?如果没有看到标题的其余部分,很难回答。

于 2011-03-20T19:35:55.857 回答