Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“部分专用化中未使用模板参数”帮助我 我一直在努力不使用C++ 0x代码,但经常使用C++。不要问我为什么要使用常规C++,这只是一些愚蠢的要求。_C++_Templates_Metaprogramming_Template Meta Programming - Fatal编程技术网

“部分专用化中未使用模板参数”帮助我 我一直在努力不使用C++ 0x代码,但经常使用C++。不要问我为什么要使用常规C++,这只是一些愚蠢的要求。

“部分专用化中未使用模板参数”帮助我 我一直在努力不使用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

所以这里的事情:我需要得到一个枚举中的值为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<> // 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};};我想不出一个方法来检测操作员