This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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;
}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]