Jump to content

  • Log In with Google      Sign In   
  • Create Account


Friend functions in namespaces


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
7 replies to this topic

#1 noatom   Members   -  Reputation: 769

Like
0Likes
Like

Posted 06 May 2013 - 01:49 PM

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?



Sponsor:

#2 Khatharr   Crossbones+   -  Reputation: 2828

Like
0Likes
Like

Posted 06 May 2013 - 02:28 PM

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, 06 May 2013 - 02:31 PM.

void hurrrrrrrr() {__asm sub [ebp+4],5;}

There are ten kinds of people in this world: those who understand binary and those who don't.

#3 noatom   Members   -  Reputation: 769

Like
-2Likes
Like

Posted 06 May 2013 - 02:37 PM

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



#4 rip-off   Moderators   -  Reputation: 7674

Like
2Likes
Like

Posted 06 May 2013 - 02:55 PM

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();
}
 


#5 Khatharr   Crossbones+   -  Reputation: 2828

Like
1Likes
Like

Posted 07 May 2013 - 03:54 AM

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.
void hurrrrrrrr() {__asm sub [ebp+4],5;}

There are ten kinds of people in this world: those who understand binary and those who don't.

#6 Wooh   Members   -  Reputation: 567

Like
0Likes
Like

Posted 07 May 2013 - 05:48 AM

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.

#7 rip-off   Moderators   -  Reputation: 7674

Like
1Likes
Like

Posted 07 May 2013 - 07:11 AM

This page, under "Reliance on friend name injection", claims that this behaviour is not standard C++.



#8 noatom   Members   -  Reputation: 769

Like
0Likes
Like

Posted 07 May 2013 - 10:06 AM

rip-off your first post clarifies it,thanks.






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS