2010-10-25 144 views
4

我正在尝试为嵌套类ArticleIterator重载< <运算符。运算符<<用于嵌套类

// ... 
class ArticleContainer { 
    public: 
     class ArticleIterator { 
         // ... 
       friend ostream& operator<<(ostream& out, const ArticleIterator& artit); 
     }; 
     // ... 
}; 

如果我定义操作< <像我通常做,我得到一个编译错误。

friend ostream& operator<<(ostream& out, const ArticleContainer::ArticleIterator& artit) { 

错误是'friend' used outside of class。我该如何解决?

回答

8

当定义函数时,只有在声明它时,才会放入friend关键字。

struct A 
{ 
struct B 
{ 
    friend std::ostream& operator<<(std::ostream& os, const B& b); 
}; 
}; 

std::ostream& operator<<(std::ostream& os, const A::B& b) 
{ 
return os << "b"; 
} 
+2

想起来了,这不是关于声明和定义。你可以在类里面定义好朋友,你可以在没有friend关键字的情况下在类之外重新声明函数。我认为这是关于特定声明出现的位置 - 朋友说明符只能应用于类定义中词法上的函数声明 – 2010-10-25 14:18:08

1

在声明中使用friend关键字来指定此func/class是朋友。在课堂以外的定义中,您可能不会使用该关键字。只需将其删除

2

您必须在类中声明它为朋友,然后在没有friend关键字的类外定义它。

class ArticleContainer { 
public: 
    class ArticleIterator { 
        // ... 
      friend ostream& operator<<(ostream& out, const ArticleIterator& artit); 
    }; 
}; 

// No 'friend' keyword 
ostream& operator<<(ostream& out, const ArticleIterator& artit);