This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Why function overloading doesn't happen when I use friend functiontemplates in class templates?
- From: Yueh-Wei Hu <ywhu at iii dot org dot tw>
- To: gcc at gcc dot gnu dot org
- Date: Mon, 24 May 2004 13:52:35 +0800
- Subject: Why function overloading doesn't happen when I use friend functiontemplates in class templates?
- Reply-to: ywhu at iii dot org dot tw
=============================================================
Question 1:
=============================================================
Hi,
When I use friend function templates in a class template, the function
overloading doesn't happend.
The following is the source.
==============================================================
#include <iostream>
template<int a, int b>
class T;
template<int a, int b>
void func(T<a, b> const * const t)
{
std::cerr << "T<a, b>" << std::endl;
}
template<int a, int b>
class T
{
private:
friend void func<a, b>(T<a, b> const * const t);
friend void func<a>(T<a, 3> const * const t);
public:
void ttt() const;
};
template<int a>
void
func(T<a, 3> const * const t)
{
std::cerr << "T<a, 3>" << std::endl;
}
template<int a, int b>
void
T<a, b>::ttt() const
{
func(this);
}
int
main()
{
T<2, 3> t;
t.ttt();
return 0;
}
==============================================================
The error messages from gcc-3.2 is as following:
==============================================================
eee.cpp: In member function `void T<a, b>::ttt() const [with int a =
2, int b =
3]':
eee.cpp:52: instantiated from here
eee.cpp:44: call of overloaded `func(const T<2, 3>* const)' is
ambiguous
eee.cpp:8: candidates are: void func(const T<a, b>*) [with int a = 2,
int b =
3]
eee.cpp:29: void func(const T<a, 3>*) [with int a = 2]
eee.cpp:8: void func(const T<a, b>*) [with int a = 2,
int b =
3]
eee.cpp:29: void func(const T<a, 3>*) [with int a = 2]
==============================================================
However, when I use gcc-3.2, gcc-3.3, gcc-3.4 to compile my code, the
result is strange.
Here is my result:
1) gcc-3.2: can _not_ compile, the error message is copied and pasted
above.
2) gcc-3.3: can compile, but the result is
T<a, b>
[but I think it should be T<a, 3>]
3) gcc-3.4: can compile, but the result is
T<a, b>
[but I think it should be T<a, 3>]
So....
What behavior conforms to the C++ standard?
And which version of gcc is correct?
< NOTE >
When I use 'struct' rather than 'class', and remove the 'friend'
declarations,
the function overloading works fine !
=============================================================
Question 2:
=============================================================
I added one more friend function declaration, and now, even gcc-3.3
doesn't compile my code.
The source code is as following:
==============================================================
#include <iostream>
template<int a, int b>
class T;
template<int a, int b>
void func(T<a, b> const * const t)
{
std::cerr << "T<a, b>" << std::endl;
}
template<int a, int b>
class T
{
private:
friend void func<a, b>(T<a, b> const * const t);
friend void func<a>(T<a, 3> const * const t);
friend void func<b>(T<3, b> const * const t); <-- add this -->
public:
void ttt() const;
};
template<int a>
void
func(T<a, 3> const * const t)
{
std::cerr << "T<a, 3>" << std::endl;
}
template<int b> <-- add this definition -->
void
func(T<3, b> const * const t)
{
std::cerr << "T<3, b>" << std::endl;
}
template<int a, int b>
void
T<a, b>::ttt() const
{
func(this);
}
int
main()
{
T<2, 3> t;
t.ttt();
return 0;
}
==============================================================
I can _not_ compile the code using gcc-3.2, and the error message for
gcc-3.2 is
like the one I posted above:
==============================================================
eee.cpp: In instantiation of `T<2, 3>':
eee.cpp:50: instantiated from here
eee.cpp:19: ambiguous template specialization `func<3>' for `void
func(const
T<3, 3>*)'
eee.cpp: In member function `void T<a, b>::ttt() const [with int a =
2, int b =
3]':
eee.cpp:52: instantiated from here
eee.cpp:44: call of overloaded `func(const T<2, 3>* const)' is
ambiguous
eee.cpp:8: candidates are: void func(const T<a, b>*) [with int a = 2,
int b =
3]
eee.cpp:29: void func(const T<a, 3>*) [with int a = 2]
eee.cpp:8: void func(const T<a, b>*) [with int a = 2,
int b =
3]
eee.cpp:29: void func(const T<a, 3>*) [with int a = 2]
==============================================================
Again, the following is the result when I compile it using gcc-3.2,
gcc-3.3 and gcc-3.4:
1) gcc-3.2: can _not_ compile, the error message posted above.
2) gcc-3.3: can _not_ compile, the error message just like the one
posted for gcc-3.2.
3) gcc-3.4: can compile, but the result is
T<a, b>
[but I think it should be T<a, 3>]
==============================================================
I can not figure it out why overloading doesn't happen.
Could somebody explain this?
[or is it a bug in gcc?]
Thank you for you help.