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