c – 为什么不允许模板专用于不同的命名空间?

前端之家收集整理的这篇文章主要介绍了c – 为什么不允许模板专用于不同的命名空间?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
请看看我正在努力做什么:
#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"; }
 };
}

这是不允许的.你能否明白为什么专业化不能在不同的命名空间中,什么是可用的解决方案?还有,它是否固定在C 0x?

这将允许我例如,专门使用std :: max,std :: swap,std :: numeric_limits等,而不是通过向:: std ::添加一些东西来诉诸未定义的行为?

@AndreyT这是我如何使用它:

// my_integer is a class
std::numeric_limits<my_integer>::max(); // specialized std::numeric_limits for my_integer

这可以做吗

解决方法

C 2003,§17.4.3.1 / 1:“程序可以为任何标准库模板添加模板专用于命名空间std.标准库模板的这种专门化(完整或部分)导致未定义的行为,除非声明取决于用户定义的外部链接名称,除非专业化符合原始模板的标准库要求.

因此,您可以专门化一个库模板,并将您的专业化命名空间std,只要它取决于用户定义的类型并满足原始模板的要求.

您编辑的问题中的代码似乎是用户定义的名称(可能)具有外部链接的专业化,因此您不应该对该部分的任何问题.

这只会使您的专业化满足原始模板的要求.对于你的类型,大多数这可能是微不足道的.我可以看到的唯一的部分可能不是很明显,你似乎必须为整个模板提供专业化,而不仅仅是numeric_limits :: max().即,你必须做一些事情(例如:128位无符号整数类型的ballpark):

namespace std { 
template <>
class numeric_limits<my_integer> {
public:

    static const bool is_specialized = true;
    static T min() throw() { return 0;
    static T max() throw() { return /* 2^128-1 */; } // ***
    static const int digits = 128;
    static const int digits10 = 38;
    static const bool is_signed = false;
    static const bool is_integer = true;
    static const bool is_exact = true;
    static const int radix = 2;
    static T epsilon() throw() { return 0; }
    static T round_error() throw() { return 0; }
    static const int min_exponent = 0;
    static const int min_exponent10 = 0;
    static const int max_exponent = 0;
    static const int max_exponent10 = 0;
    static const bool has_infinity = false;
    static const bool has_quiet_NaN = false;
    static const bool has_signaling_NaN = false;
    static const float_denorm_style has_denorm = denorm_absent;
    static const bool has_denorm_loss = false;
    static T infinity() throw() { return 0; }
    static T quiet_NaN() throw() { return 0; }
    static T signaling_NaN() throw() { return 0; }
    static T denorm_min() throw() { return 0; }
    static const bool is_iec559 = false;
    static const bool is_bounded = true;
    static const bool is_modulo = true;
    static const bool traps = false;
    static const bool tinyness_before = false;
    static const float_round_style round_style = round_toward_zero;
};
}

其中一些是真正的FP类型,并不需要对整数类型有意义;我相信他们还需要实施.

猜你在找的C&C++相关文章