1

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

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

4

2 回答 2

3
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

于 2011-06-18T08:41:07.680 回答
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> {...};
于 2011-06-18T08:39:50.387 回答