Jump to content
  • Advertisement
Sign in to follow this  
noatom

Friend functions in namespaces

This topic is 2049 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

namespace Me{
class Us{
friend void you();
};
}

 

According to a book: "Now the function you is a member of the namespace Me".

 

And also: "If you introduce a friend in the global namespace,the friend is injected globally".

 

Statement 1: What does it mean it's a member of the namespace?!

 

Statement 2: So if I add a friend function in a class that is in the global namespace,because I want it to,ALL the other classes that I added in the global namespace will take that class as a friend too?

Share this post


Link to post
Share on other sites
Advertisement
A friend prototype works as a declaration in the scope of the class.
 
 
class Foo {
  friend void bar(); //declaration
};
 
void bar() {
 //definition
}
 
just like
 
 
void foobar(); //declaration
 
void foobar() {
  //definition
}
What friend does is that the function prototyped has access to all of the class' members, even the private or protected ones. It's an external function with internal access. Your book is just doing a poor job of explaining it. Edited by Khatharr

Share this post


Link to post
Share on other sites

you got it wrong,the book explained in details the effects of friend,but it appears that friend is applied in another way in a namespace

Share this post


Link to post
Share on other sites

Caveat: This is not an area of C++ I am very familiar with, but this is my interpretation of what the book says. My compiler happens to agree with me.

 

Statement 1: What does it mean it's a member of the namespace?!

It means that the function that is friended is Me::you() - that is how you would call it from main(). To friend a global function, then you'd have to write:

void globalFunction();
 
namespace SomeNamespace
{
 
    class Example
    {
        friend void ::globalFunction();
     };
}

 

Statement 2: So if I add a friend function in a class that is in the global namespace,because I want it to,ALL the other classes that I added in the global namespace will take that class as a friend too?

No. They are saying that when you use the friend keyword to introduce a function, this is implicitly declaring the function (if it is not already declared). In the case the class offering friendship is not in a namespace, the function implicitly declared is also part of the global namespace:

class Example
{
    friend void someFunction();
};

In this example, the friend statement doubles as a declaration of someFunction in the global namespace.

 

Perhaps the following complete example might be illustrative:

 
class SomeClass {
    // Implicitly declaring "someFunction" in the global namespace
    friend void someFunction();
};
 
namespace SomeNamespace
{
    class SomeNamespaceClass
    {
        // This line wouldn't compile without the (implicit) declaration above
        friend void ::someFunction();
 
        // Implicitly declaring "someNamespaceFunction" in SomeNamespace
        friend void someNamespaceFunction();
    };
}
 
// We can call these functions in main now, despite not having declared them outside the friend declarations
int main() {
    someFunction();
    SomeNamespace::someNamespaceFunction();
}
 

Share this post


Link to post
Share on other sites

you got it wrong,the book explained in details the effects of friend,but it appears that friend is applied in another way in a namespace

No.

A friend prototype works as a declaration in the scope of the class.

If the class is declared within a namespace then the friend function declaration is within that same namespace. It's declared at the same scope as the class. This is what the book is saying.

rip-off got it as well.

Share this post


Link to post
Share on other sites
I don't think the book is correct, or it is talking about a specific compiler. To make rip-off's code compile in GCC 4.7.2 I had to declare someFunction() before namespace SomeNamespace and declare SomeNamespace::someNamespaceFunction() before main.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!