繁体   English   中英

为我提供“部分专业化中未使用的模板参数”

[英]Help me with “template parameters not used in partial specialization”

我一直在努力使用非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> {...};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM