【问题标题】:Help me with "template parameters not used in partial specialization"帮我解决“部分专业化中未使用的模板参数”
【发布时间】:2011-06-18 08:38:14
【问题描述】:

我一直在努力使用不是 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 };
  };

我敢打赌,如果它不是部分特化,那么它会起作用,但显式的不能在命名空间范围内。而且我显然不能在模板中专门化模板而不专门化它们。我可以吗?

【问题讨论】:

  • 答案解释了如何使事情变得 wokr,但从名称来看,您只需要一种类型,根据您定义的专业化说明某些内容可打印或不可打印,在这种情况下您只需要 @ 987654322@作为主模板,然后对于每个可打印类型,定义template &lt;&gt; struct CanPrint&lt;MyType&gt; { enum { value = 1 }; };我想不出没有C++11自动检测operator&lt;&lt;的方法。

标签: c++ templates metaprogramming template-meta-programming


【解决方案1】:
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

【讨论】:

  • 确实如此。然而,我无法在命名空间范围内进行完全专业化。我真的必须离开那个命名空间吗?
【解决方案2】:
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> {...};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2018-08-25
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多