Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

help with namespace/friend error

0 views
Skip to first unread message

Joe

unread,
Oct 28, 2009, 8:54:15 PM10/28/09
to
Shouldn't I be able to use a friend function like below? I'm getting
the following compiler errors in XCode 3 …

'test' was not declared in this scope
'double AB::test(double, double)' should have been declared inside 'AB'

Seems like this might have something to do w/ my namespaces. I've tried
to include everything I thought relevant to this problem.

--- BN.h ---
namespace AB {
class BN
{
public:
friend double test(double a, double b);
};
}

--- BN.cc ---
// error on next line … 'double AB::test(double, double)' should have
been declared inside 'AB'
double AB::test(double a, double b)
{
return
};

--- AL.h ---
namespace AB {
class AL : public BL
{
public:
AL();
};
}

--- AL.cc ---
using namespace std;

// constructor
AB::AL::AL() : BL() {
// error on next line … 'test' was not declared in this scope
test();
};

In case the above looks strange, I've double checked for any typos, and
it's all right (left out forward declarations, headers, etc...). This
used to compile in XCode 2.

Johannes Schaub (litb)

unread,
Oct 28, 2009, 10:05:10 PM10/28/09
to
Joe wrote:

It's wrong because a friend function declaration just declares a function as
a friend, but it will never introduce a visible name into an enclosing scope
(the name is introduced, but it's *not* visible). Argument dependent lookup
is a special case, in which the function name introduced by that declaration
is visible in its namespace.

This means, you have to declare it yourself in AB before you define it
outside of it.

Joe

unread,
Oct 28, 2009, 11:29:49 PM10/28/09
to
>
> This means, you have to declare it yourself in AB before you define it
> outside of it.


How do I declare this before I define it? I thought that's what I was
doing, declaring it within the namespace AB of the class BN, and of
course it's defined elsewhere.

Guess I still don't' understand about introducing a visible name into
an enclosing scope (which I thought it was).

Michael Tsang

unread,
Oct 30, 2009, 6:26:21 AM10/30/09
to
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Joe wrote:

// BN.h


namespace AB {
class BN
{
public:
friend double test(double a, double b);
};
double test(double a, double b);
}

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEARECAAYFAkrqv00ACgkQG6NzcAXitM9V7ACfQ+/KIsAkKsz297+btbV+5l8+
X1UAnApoL5M7za2hOup0WhXmoQ5UVQrJ
=nfwQ
-----END PGP SIGNATURE-----

0 new messages