我一直在努力使用NOT 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 };
};
我敢打赌,如果它不是部分特化,那么它可以工作,但是显式的不能在命名空间范围内。而且我显然不能在模板中专门化模板而不专门化它们。我可以吗?
答案 0 :(得分: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
答案 1 :(得分: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> {...};