帮助我“部分专业化中不使用的模板参数”

| 我一直在努力使用非C ++ 0x代码,但使用常规C ++。不要问我为什么我必须使用常规C ++,这只是一种愚蠢的要求。 所以这就是问题:关于某个语句是对还是错,我需要在枚举中获取一个值为1或0的值。 因此,当然,我在枚举中模板化了一个包含0的结构,并用第二个语句对其进行了专门化,其中该枚举包含1而不是0。 对我来说似乎很合法,但是它告诉我应该使用专业化的参数。这有点奇怪,因为我试图以所有可能的方式使用它,并且它只会不断弹出此错误。 这是代码:
  template<typename T>
  struct CanPrint
  {
    template<size_t>
    struct Value               { enum { val = 0 }; };

    template<size_t>
    struct Value<sizeof(True)> { enum { val = 1 }; };

    enum
    { value = Value<sizeof(IsTrue<T>(0))>::val };
  };
我敢打赌,如果不是部分专业化的话,这将是可行的,但是显式的专业化不能在命名空间范围内进行。而且,显然,如果不对模板和模板进行专门化处理,就无法对模板进行专门化处理。我可以吗 ?     
已邀请:
        
template<>  //<---- leave it empty
struct Value<sizeof(True)> { enum { val = 1 };
顺便说一句,如果
True
不是模板参数,它不是部分专业化的。它是完全专业化的。 而且由于这是完全专业化的,因此您不能在类内部(即在类范围内)定义它。完全专业化只能在命名空间范围内定义。因此,在名称空间范围内定义
Value
以及专业化。 或者,您可以改为执行以下操作:
template<typename T>
struct CanPrint
{
    //modified
    template<typename U, size_t N = sizeof(U)> 
    struct Value { enum { val = 0 }; };

    //modified - now its partial specialization
    template<typename U>    
    struct Value<U, sizeof(True)> { enum { val = 1 }; };

    enum { value = Value<IsTrue<T> >::val }; //modified here as well
};
参见在线演示:http://www.ideone.com/MSG5X     
        
template<> // note the empty <>
struct Value<sizeof(True)> { enum { val = 1 }; };
您仅列出部分专业化的参数:
template< typename T, typename U> 
struct X;

template<typename U> 
struct X<char,U> {...};

template<typename Z, typename U> 
struct X<std::vector<Z>, U> {...};
不适用于全部专业:
template<> 
struct X<double,int> {...};
    

要回复问题请先登录注册