This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
g++ bug or just bad code?
- From: Rennie deGraaf <degraaf at cpsc dot ucalgary dot ca>
- To: gcc at gnu dot org
- Cc: degraaf at cpsc dot ucalgary dot ca
- Date: Thu, 23 Oct 2003 13:50:21 -0600
- Subject: g++ bug or just bad code?
The attached code compiles and works properly when I comment out the
declaration, definition, and invocations of the method 'eck'. With
"eck" in there, g++ fails with
ttest.cpp:23: template-id `eck<>' for `void blah<int>::eck(int)'
does not match any template declaration
ttest.cpp:23: syntax error before `{' token
ttest.cpp:25: syntax error before `<<' token
Note that 'gak' (a template function in a template class) works, as does
'ugh" (a normal function in a specialized template class); it's only
'eck', a template function in a specialized template class, that fails.
The compiler was g++ 3.2.2 20030222 on Red Hat 9 i386.
g++ 2.95.3 on Solaris SPARC 8 failed, with a different error.
It did compile on Solaris 8 using Sun's C++ compiler, but when I called
blah<char> b.eck<float>() without ever defining a specialization for
blah<char>::eck(), it just called blah<int>::eck(). This doesn't help
me much, since the code must run on Linux i386.
Unfortunately, I don't have access to a system with a latest-release gcc
to test.
Do I have a gcc bug, or just bad code?
If it is a bug, does anyone know of a workaround I could use for the
time being? If it's bad code, then what am I doing wrong? Is Sun's CC
in error compiling this?
Thanks for the help.
Rennie deGraaf
--
-ASCII silly question, get a silly ANSI.
-????
#include <iostream>
#include <typeinfo>
using namespace std;
template <class TYPE>
class blah
{
TYPE feh;
public:
void blech(int x);// { cout << typeid(feh).name() << endl; }
template <class T> void gak(int x);// { T a; cout << typeid(a).name() << endl; }
template <class T> void eck(int x);
void ugh(int x);
};
template <class TYPE> template <class T> void blah<TYPE>::gak(int x)
{
T a;
cout << typeid(a).name() << endl;
}
template <> template <class T> void blah<int>::eck(int x)
{
T a;
cout << typeid(a).name() << typeid(feh).name() << endl;
}
template <class TYPE> void blah<TYPE>::blech(int x)
{
cout << typeid(feh).name() << endl;
}
template <> void blah<int>::ugh(int x)
{
cout << typeid(feh).name() << endl;
}
/*template <> template <class T> void blah<char>::eck(int x)
{
T a;
cout << "calling blah<char>::eck(int) " << typeid(feh).name() << "\n";
}*/
template <class T>
void foobar(int x)
{
T a;
cout << typeid(a).name() << endl;
}
int main()
{
cout << "call foobar with int: ";
foobar<int>(1);
cout << "call foobar with char: ";
foobar<char>(1);
cout << "call foobar with short: ";
foobar<float>(1);
cout << "call foobar with int*: ";
foobar<int*>(1);
blah<int> a;
blah<char> b;
blah<float> c;
blah<int*> d;
cout << "call blah<int>.blech(): ";
a.blech(1);
cout << "call blah<char>.blech(): ";
b.blech(1);
cout << "call blah<float>.blech(): ";
c.blech(1);
cout << "call blah<int*>.blech(): ";
d.blech(1);
cout << "call blah<int>.gak<float>(): ";
a.gak<float>(1);
cout << "call blah<int>.ugh(): ";
a.ugh(1);
// cout << "call blah<char>.ugh(): ";
// b.ugh(1); // this isn't defined, and shouldn't work
cout << "call blah<int>.eck<float>(): ";
a.eck<float>(1);
// cout << "call blah<char>.eck<float>(): ";
// b.eck<float>(1); // this isn't defined, and shouldn't work
return 0;
}