“部分专用化中未使用模板参数”帮助我 我一直在努力不使用C++ 0x代码,但经常使用C++。不要问我为什么要使用常规C++,这只是一些愚蠢的要求。
所以这里的事情:我需要得到一个枚举中的值为1或0,关于某个语句是真是假。 当然,我在一个枚举中模板化了一个包含0的结构,用第二条语句专门化了它,其中枚举包含1而不是0 对我来说似乎很合法,但是,它告诉我应该使用专门化的参数。这有点奇怪,因为我试着用各种可能的方式使用它,但它总是会出现这个错误 代码如下:“部分专用化中未使用模板参数”帮助我 我一直在努力不使用C++ 0x代码,但经常使用C++。不要问我为什么要使用常规C++,这只是一些愚蠢的要求。,c++,templates,metaprogramming,template-meta-programming,C++,Templates,Metaprogramming,Template Meta Programming,所以这里的事情:我需要得到一个枚举中的值为1或0,关于某个语句是真是假。 当然,我在一个枚举中模板化了一个包含0的结构,用第二条语句专门化了它,其中枚举包含1而不是0 对我来说似乎很合法,但是,它告诉我应该使用专门化的参数。这有点奇怪,因为我试着用各种可能的方式使用它,但它总是会出现这个错误 代码如下: template<typename T> struct CanPrint { template<size_t> struct Value
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<> // 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> {...};
不适用于完全专业:
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> {...};
仅列出部分专门化的参数:
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> {...};
不适用于完全专业:
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> {...};
请参阅在线演示:
请参见在线演示:确实如此。然而,我不能在名称空间范围内进行完全的专门化。我真的必须离开这个名称空间吗?的确。然而,我不能在名称空间范围内进行完全的专门化。我真的必须离开这个名称空间吗?答案解释了如何使事物成为wokr,但从名称判断,您只需要一个类型,该类型表示某些东西是可打印的,或者不是基于您定义的专业化,在这种情况下,您只需要模板结构CanPrint{enum{value=0};};作为主模板,然后为每个可打印类型定义模板结构CanPrint{enum{value=1};};我想不出一种检测运算符的方法。答案解释了如何使事物成为wokr,但从名称判断,您只需要一个类型,该类型表示某些内容是可打印的,或者不是基于您定义的专业化,在这种情况下,您只需要模板结构CanPrint{enum{value=0};};作为主模板,然后为每个可打印类型定义模板结构CanPrint{enum{value=1};};我想不出一个方法来检测操作员