On 6/13/06, Gavin Band <[EMAIL PROTECTED]> wrote:
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.

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

You need to make a specialization declaration visible to main(), otherwise
gcc will inline the not specialized version at -O and above.

Richard.

Reply via email to