迁移C ++代码以使用标准标头。现在得到:引用'ostream'模棱两可

时间:2011-03-20 19:33:27

标签: c++ std ostream

我一直在迁移一些代码来改变标头的声明,因为它们不包含在我的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

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

3 个答案:

答案 0 :(得分:5)

在Item.h中看起来像是这样的一行:

struct ostream;

您遇到的问题是ostream不是struct;它是typedef的{​​{1}},因此您对basic_ostream<char>的自定义定义与ostreamostream的前向声明的标准定义相冲突。因此,当你写

<iosfwd>

编译器无法判断friend ostream& operator<< ( ostream& os, const Item& item ); 是否指向您的ostream或标准头文件导出的更复杂的struct ostream

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

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

答案 1 :(得分:1)

comppiler会告诉你究竟发生了什么:

有一个名为basic_ostream<char...>的模板特化(ostream)的typedef(显然来自标准标题),并且在代码中的其他位置定义了struct ostream(其中你必须寻找和重命名/ ramove)。因此含糊不清

答案 2 :(得分:0)

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