473,403 Members | 2,366 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

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

Possible g++ bug in template parsing

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 and run on Solaris 8 using Sun's C++ compiler. This
doesn't help me much, since the code must run on Linux i386, but
suggests that the code is probably valid.

Unfortunately, I don't have access to a system with a latest-release
gcc to test.

Do I have a gcc bug, or is this code actually invalid?

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

-------------------------------------

#include <iostream>
#include <typeinfo>
using namespace std;

template <class TYPE>
class blah
{
TYPE feh;
public:
void blech(int x);
template <class T> void gak(int x);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;
}
Jul 19 '05 #1
3 2297
"Rennie deGraaf" <re****@my-dejanews.com> wrote in message
news:7c**************************@posting.google.c om...
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
I think this is correct.
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. [...]
Do I have a gcc bug, or is this code actually invalid?
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?
Looks like it to me.
[...]
template <class TYPE>
class blah
{
TYPE feh;
public:
void blech(int x);
template <class T> void gak(int x);endl; }
This obviously isn't a cut-n-paste, or this line shouldn't compile.
template <class T> void eck(int x);
void ugh(int x);
};

template <> template <class T> void blah<int>::eck(int x)
{
T a;
cout << typeid(a).name() << typeid(feh).name() << endl;
}
[...]
template <> void blah<int>::ugh(int x)
{
cout << typeid(feh).name() << endl;
}
[...]


At no point do you define the specialization:

template <>
class blah<int>
{
...
};

Therefore, defining member functions of this specialization
is illegal. The solution is to define the class specialization.

Dave

---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.521 / Virus Database: 319 - Release Date: 9/23/2003
Jul 19 '05 #2
"David B. Held" <dh***@codelogicconsulting.com> wrote in message news:<bn**********@news.astound.net>...
"Rennie deGraaf" <re****@my-dejanews.com> wrote in message
news:7c**************************@posting.google.c om...
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
I think this is correct.
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.

[...]
Do I have a gcc bug, or is this code actually invalid?


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?


Looks like it to me.
[...]
template <class TYPE>
class blah
{
TYPE feh;
public:
void blech(int x);
template <class T> void gak(int x);endl; }


This obviously isn't a cut-n-paste, or this line shouldn't compile.


Sorry about that; I deleted a multi-line comment when I posted it, and
evidently missed part. The rest IS a cut-and-paste.
template <class T> void eck(int x);
void ugh(int x);
};

template <> template <class T> void blah<int>::eck(int x)
{
T a;
cout << typeid(a).name() << typeid(feh).name() << endl;
}
[...]
template <> void blah<int>::ugh(int x)
{
cout << typeid(feh).name() << endl;
}
[...]
At no point do you define the specialization:

template <>
class blah<int>
{
...
};

Therefore, defining member functions of this specialization
is illegal. The solution is to define the class specialization.


Then how come this is accepted, and works properly?

template <> void blah<int>::ugh(int x)
{
cout << typeid(feh).name() << endl;
}
Dave

---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.521 / Virus Database: 319 - Release Date: 9/23/2003

Jul 19 '05 #3
"Rennie deGraaf" <re****@my-dejanews.com> wrote in message
news:7c**************************@posting.google.c om...
[...]
Then how come this is accepted, and works properly?

template <> void blah<int>::ugh(int x)
{
cout << typeid(feh).name() << endl;
}


Because the compiler is broken? Usually, when something
unexpectedly works, something else (that should) doesn't.
Try this, for instance, define the specialization *after* this
definition, and see what the compiler says.

Dave

---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.521 / Virus Database: 319 - Release Date: 9/23/2003
Jul 19 '05 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

14
by: comp.lang.php | last post by:
I've heard numerous and varied commentaries here and on other fora regarding PHP and the concept of threads. Coming from a Java background I understand how threads benefit to prevent collisions,...
2
by: bettyann | last post by:
i am using templates via HTML_Template_IT to create a table from the results of a mysql query. i wanted to change the background image of alternating rows in the table. i thought i could do this...
2
by: Richard Cromer | last post by:
Greetings, I am trying to create a template class called Matrix that operates on a template class called complex. Now of course complex is a template class and I want it to be the argument...
2
by: JT | last post by:
I have a compiler error when using a non-dependent type declared in a template, if I use the type in function definitions. I think it is a parsing issues related to confusion with a typename. ...
2
by: max_sang | last post by:
Hello I have a nasty problem... take a look at this code: struct Parser { Parser(const string& s) { ... tokenizes s into pieces... } template <class T> to(size_t idx); private: vector<string>...
6
by: Stuart McGraw | last post by:
I am looking for a VBA "format" or "template" function, that is, a function that takes a format string and a varying number of arguments, and substitutes the argument values into the format string...
2
by: booker | last post by:
the following codes can pass the compilation in VC6 but not in VC7.1.. is it a bug? #include <list> template<class type> class myclass { typedef myclass<type> mytype;
2
by: RitualDave | last post by:
I get a C2811 error when I compile the following (with the /clr switch): template <class T> ref class Base {}; template <template <class> class TBase> ref class Derived : TBase<int> {};
2
by: a | last post by:
I'm having problem compiling this simple template program, my g++ complains it doesn't know what size and ia are on ArrayRC. TIA, John #include <iostream.h>
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...

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.