Please, see what I am trying to do:
#include <iostream>
namespace first
{
template <class T>
class myclass
{
T t;
public:
void who_are_you() const
{ std::cout << "first::myclass"; }
};
}
namespace second
{
using first::myclass;
template <>
class myclass <int>
{
int i, j;
public:
void who_are_you() const
{ std::cout << "second::myclass"; }
};
}
This isn’t allowed. Could you please, clarify why can’t specializations be in different namespaces, and what are the available solutions? Also, is it something fixed in C++0x?
This would allow me for example, to specialize std::max, std::swap, std::numeric_limits, etc.. without resorting to undefined behavior by adding something to ::std::?
@AndreyT Here is how I though I would use it:
// my_integer is a class
std::numeric_limits<my_integer>::max(); // specialized std::numeric_limits for my_integer
Can this be done?
C++ 2003, §17.4.3.1/1: “A program may add template specializations for any standard library template to namespace std. Such a specialization (complete or partial) of a standard library template results in undefined behavior unless the declaration depends on a user-defined name of external linkage and unless the specialization meets the standard library requirements for the original template.”
As such, you’re allowed to specialize a library template, and put your specialization in namespace
std, as long as it depends on a user defined type and meets the requirements of the original template.The code you have in your edited question seems to be a specialization for a user-defined name that (presumably) has external linkage, so you shouldn’t have any problem with that part of things.
That leaves only the requirement that your specialization meet the requirements of the original template. For your type, most of this will probably border on trivial. The only part I can see that might not be obvious is that you do seem to have to provide a specialization for the whole template, not just
numeric_limits::max(). I.e., you’ll have to do something like (example should be in the ballpark for a 128-bit unsigned integer type):Quite a few of those are really for FP types, and aren’t required to be meaningful for an integer type; I believe they still need to be implemented.