Hello,
I hope this is the right place for this sort of question, which concerns
the behaviour of gcc (versions 3.4.4 and 4.1.1) and template
specialisations.

I have some code split into three files header.hpp, specialisation.cpp,
and main.cpp, given below.  A class having a template member function
print() is defined in "header.hpp", and a specialisation of print() for
std::strings is defined in "specialisation.cpp".  In "main.cpp" print()
is used to print an integer and then a string.

Without any optimisation turned on (i.e. compiling with the command line

"g++ -o test test.cpp specialisation.cpp")

the program output is

$ ./main
The object of type T was: 256.
The string was: hello.

If I compile with -O3, however, I get

$ ./main
The object of type T was: 256.
The object of type T was: hello.

Let me call the former behaviour "good" and the latter "bad" - here are
the optimisation flags which cause "good" and "bad" behaviour on my
machine:

gcc 3.4.4:  good: -O0, -O1 bad: -O2 or greater.
gcc 4.1.1:  good: -O0 bad: -O1 or greater

But perhaps it is not gcc but rather my code that is at fault?  This is
on a Linux box.  The code is below.

Thanks for your help,
Gavin Band


----- file header.hpp ------

#ifndef HEADER
#define HEADER

#include <iostream>

struct A
{
  template<typename T>
  void print(std::ostream& out, T const& t)
  {
         out << "The object of type T was: " << t << ".\n";
  }
};

#endif

------ file specialisation.cpp ------

#include <iostream>
#include <string>
#include "header.hpp"

template<>
void A::print<std::string>(std::ostream& out, std::string const& t)
{
  out << "The string was: " << t << ".\n";
}

------ file main.cpp ------

#include <iostream>
#include <string>
#include "header.hpp"

int main(int argc, char** argv)
{
  std::string s("hello");
  int i(256);

  A a;
  a.print(std::cerr, i);
  a.print(std::cerr, s);

  return 0;
}

------ end of files ------

Reply via email to