ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – SFINAE尝试用bool给出了编译错误:“模板参数’T :: value’涉及模板参数”[复制]

2019-09-27 10:04:42  阅读:231  来源: 互联网

标签:c templates compiler-errors sfinae


参见英文答案 > Why is it disallowed for partial specialization in a non-type argument to use nested template parameters                                    2个
我尝试使用bool实现SFINAE(与流行的void_trick不同):

  template<typename T, bool = true>
  struct Resolve
  {
    static const bool value = false;
  };

  template<typename T>
  struct Resolve<T, T::my_value>
  {
    static const bool value = true;
  };

目标是专门化,具有静态const bool my_value = true的类;在里面定义.如果定义为false或未定义,则不要将其专门化.即

struct B1 {  // specialize Resolve for this case
  static const bool my_value = true;
};
struct B2 {  // don't specialize
  static const bool my_value = false;
};
struct B3 {};  // don't specialize

在B1上应用上述技巧时,它会给出编译错误:

Resolve<B1>::value;

error: template argument ‘T::my_value’ involves template parameter(s)

我知道这可以通过其他方式实现.但是,我有兴趣知道,为什么它会在这里给出编译器错误并且可以在这段代码中解决它?

解决方法:

实际上,§14.5.4/ 9节禁止你所做的事情,

A partially specialized non-type argument expression shall not involve a template parameter of the partial specialization except when the argument expression is a simple identifier.

诀窍可能是使用第二个模板参数的类型,封装非类型值,如下所述:

template<bool b> struct booltype {};

template<typename T, typename B = booltype<true> >
struct Resolve
{
  static const bool value = false;
};

template<typename T>
struct Resolve<T, booltype<T::my_value> >
{
  static const bool value = true;
};

现在它compile fines.

标签:c,templates,compiler-errors,sfinae
来源: https://codeday.me/bug/20190927/1823608.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有