472,090 Members | 1,367 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,090 software developers and data experts.

Howto declare a friend function to a nested class

Dear all,

I'm trying to declare the operator++ to a nested class. The nested
class is not template but the container it is.

The code used in teh sample program is included bellow:
#include <iostream>
template <class T>
class A
{
public:
class B;
};
template <class T>
bool operator == <T(const A<T>::B &b1,
const class A<T>::B &b2);
template <class T>
class A<T>::B
{
public:
B(int a);

friend bool operator ==<(const A<T>::B &b1, const A<T>::B &b2);

private:
int aa;
B b;
};
template <class T>
A<T>::B::B(int a):
aa(a)
{}
template <class T>
bool operator == <>(const A<T>::B& b1, const A<T>::B& b2)
{
return b1.aa == b2.aa;
}
class C {};
int main()
{
A<Cac;

A<C>::B b1(4), b2(5);

bool res = (b1 == b2);
return 0;
}
I'm compiling with gcc version 4.1.2. The output of the compiler is
included bellow:

nested.cpp:13: error: expected initializer before '<' token
nested.cpp:23: error: expected unqualified-id before 'template'
nested.cpp:38: error: expected initializer before '<' token
nested.cpp: In instantiation of 'A<C>::B':
nested.cpp:51: instantiated from here
nested.cpp:27: error: 'A<T>::B::b' has incomplete type
nested.cpp:19: error: declaration of 'class A<C>::B'
nested.cpp: In function 'int main()':
nested.cpp:53: error: no match for 'operator==' in 'b1 == b2'

Any help will be appreciated.

Thanks and Best Regards,
Joaquim Duran

Sep 30 '07 #1
3 3762
jd*********@gmail.com wrote:
[..]
template <class T>
class A<T>::B
{
public:
B(int a);

friend bool operator ==<(const A<T>::B &b1, const A<T>::B &b2);

private:
int aa;
B b;
Am I reading this right? An instance of your 'B' class contains
another instance of the same class, 'b'? Not gonna work.

Fix this first, then post the corrected code again.

And keep in mind that a member of a class template _is_ essentially
a template itself.
};
[..]
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Sep 30 '07 #2
On 30 Set, 02:15, "Victor Bazarov" <v.Abaza...@comAcast.netwrote:
jduranco...@gmail.com wrote:
[..]
template <class T>
class A<T>::B
{
public:
B(int a);
friend bool operator ==<(const A<T>::B &b1, const A<T>::B &b2);
private:
int aa;
B b;

Am I reading this right? An instance of your 'B' class contains
another instance of the same class, 'b'? Not gonna work.

Fix this first, then post the corrected code again.

And keep in mind that a member of a class template _is_ essentially
a template itself.
};
[..]

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
I agree, in the sample, I've declared a recursive type that C++ is not
supporting. I've removed it, and I've improved the syntax (adding
typename as suggested, thanks). Now, the only error is the declaration
of a friend template function.
Improved source code:

#include <iostream>
template <typename T>
class A
{
public:
class B;
};
/* Example of template function */
template <typename T>
T add(T a, T b) {return a+b;}
template <typename T>
bool operator == (const typename A<T>::B &b1,
const typename A<T>::B &b2);
template <typename T>
class A<T>::B
{
public:
B(int a);

friend bool operator == <(const typename A<T>::B &b1,
const typename A<T>::B &b2); // Line 29

private:
int aa;
};
template <typename T>
A<T>::B::B(int a):
aa(a)
{}
template <typename T>
bool operator == (const typename A<T>::B& b1,
const typename A<T>::B& b2)
{
return b1.aa == b2.aa;
}
class C {};
int main()
{
A<C>::B b1(4), b2(5);

bool res = (b1 == b2); // Line 57
return 0;
}
The message error from compiler is:

nested.cpp: In instantiation of 'A<C>::B':
nested.cpp:55: instantiated from here
nested.cpp:29: error: template-id 'operator==<>' for 'bool
operator==(const A<C>::B&, const A<C>::B&)' does not match any
template declaration
nested.cpp: In function 'int main()':
nested.cpp:57: error: no match for 'operator==' in 'b1 == b2'

I've googled a litle abut how declare template functions as friends,
and It looks likes that the current syntax is right.

Thanks and Best Regads,
Joaquim Duran

Sep 30 '07 #3
jd*********@gmail.com wrote:
[...]
Improved source code:

#include <iostream>
template <typename T>
class A
{
public:
class B;
};
/* Example of template function */
template <typename T>
T add(T a, T b) {return a+b;}
template <typename T>
bool operator == (const typename A<T>::B &b1,
const typename A<T>::B &b2);
template <typename T>
class A<T>::B
{
public:
B(int a);

friend bool operator == <(const typename A<T>::B &b1,
Should be

friend bool operator == <T...
const typename A<T>::B &b2); // Line 29

private:
int aa;
};
template <typename T>
A<T>::B::B(int a):
aa(a)
{}
template <typename T>
bool operator == (const typename A<T>::B& b1,
const typename A<T>::B& b2)
{
return b1.aa == b2.aa;
}
class C {};
int main()
{
A<C>::B b1(4), b2(5);

bool res = (b1 == b2); // Line 57
There is no way for the compiler to determine that the template
operator should be used because from the expression 'b1 == b2'
the compiler cannot deduce the 'C' for the template -- the context
is not one of the deducible contexts.
return 0;
}
The message error from compiler is:

nested.cpp: In instantiation of 'A<C>::B':
nested.cpp:55: instantiated from here
nested.cpp:29: error: template-id 'operator==<>' for 'bool
operator==(const A<C>::B&, const A<C>::B&)' does not match any
template declaration
That can be rectified by placing 'T' in the angle brackets, see
above.
nested.cpp: In function 'int main()':
nested.cpp:57: error: no match for 'operator==' in 'b1 == b2'
This cannot be corrected because the compiler canno deduce the 'T'
for the template operator==
I've googled a litle abut how declare template functions as friends,
and It looks likes that the current syntax is right.
Apparently it wasn't.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Sep 30 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by Joe Carner via .NET 247 | last post: by
2 posts views Thread by tinman | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.