I am trying to define the full specialization of std::basic_string< char, char_traits<char>, allocator<char> > , which is the typedef'd (in g ++) header of <string> .
The problem is that if I include <string> , first g ++ sees typedef as an instance of basic_string and gives me errors. If I do my specialization first, I have no problem.
I will be able to determine my specialization after the inclusion of <string> . What do I need to do to do this?
My code is:
#include <bits/localefwd.h> //#include <string> // <- uncommenting this line causes compilation to fail namespace std { template<> class basic_string< char, char_traits<char>, allocator<char> > { public: int blah() { return 42; } size_t size() { return 0; } const char *c_str() { return ""; } void reserve(int) {} void clear() {} }; } #include <string> #include <iostream> int main() { std::cout << std::string().blah() << std::endl; }
The above code is working fine. But, if I uncomment the first line of #include <string> , I get the following compiler errors:
blah.cpp:7: error: specialization of 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >' after instantiation blah.cpp:7: error: redefinition of 'class std::basic_string<char, std::char_traits<char>, std::allocator<char> >' /usr/include/c++/4.4/bits/stringfwd.h:52: error: previous definition of 'class std::basic_string<char, std::char_traits<char>, std::allocator<char> >' blah.cpp: In function 'int main()': blah.cpp:22: error: 'class std::string' has no member named 'blah'
Line 52 from /usr/include/c++/4.4/bits/stringfwd.h :
template<typename _CharT, typename _Traits = char_traits<_CharT>, typename _Alloc = allocator<_CharT> > class basic_string;
As far as I know, this is just forward partitioning of the template, not an instance, as g ++ claims.
Line 56 from /usr/include/c++/4.4/bits/stringfwd.h :
typedef basic_string<char> string;
As far as I know, this is just a typedef, not an instance.
So why do these lines contradict my code? What can I do to fix this, except that my code is always included before <string> ?