help with namespace/friend error

J

Joe

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.
 
J

Johannes Schaub (litb)

Joe said:
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.
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.
 
J

Joe

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).
 
M

Michael Tsang

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
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).

// 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-----
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,048
Latest member
verona

Latest Threads

Top