【问题标题】:Compilation error when restricting template parameters of derived class with std::enable_if使用 std::enable_if 限制派生类的模板参数时出现编译错误
【发布时间】:2020-06-22 22:29:00
【问题描述】:

这样编译:

template<typename T, class T2, class = typename std::enable_if<std::is_arithmetic<T>::value, T>::type>
 class ENABLE{
 public:
     T a;
     ENABLE(T b): a(b) {};
 };

template<typename T, class T2>
 class ENABLE_CHILD : public ENABLE<T, T2> {
 public:
    ENABLE_CHILD(T x): ENABLE<T, T>(x) {};
    bool FOO(auto a);
 };

template<typename T, class T2>
 bool ENABLE_CHILD<T, T2>::FOO(auto a) { return(1); };

但这不是:

template<typename T, class T2, class = typename std::enable_if<std::is_arithmetic<T>::value, T>::type>
 class ENABLE{
 public:
     T a;
     ENABLE(T b): a(b) {};
 };

template<typename T, class T2, class = typename std::enable_if<std::is_arithmetic<T>::value, T>::type>
 class ENABLE_CHILD : public ENABLE<T, T2> {
 public:
    ENABLE_CHILD(T x): ENABLE<T, T>(x) {};
    bool FOO(auto a);
 };

template<typename T, class T2>
 bool ENABLE_CHILD<T, T2>::FOO(auto a) { return(1); };

错误信息:

  1. 错误:无效使用不完整类型'class ENABLE_CHILD'
  2. 注意:'class ENABLE_CHILD 的声明(单击此按钮可进入声明声明)

所以我的编译器认为这个类是不完整的。有想法该怎么解决这个吗?提前致谢。

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    将此代码粘贴到 godbolt.org 时,我遇到了另一个错误。您还需要在成员函数定义中包含第三个模板参数:https://godbolt.org/z/kxpvQt

    模板
    bool ENABLE_CHILD::FOO(auto a) { return(1); };
    

    【讨论】:

      【解决方案2】:

      我不知道您是否还有其他想法,不应该是算术类型,但是我将 enable_ifs 替换为 static_asserts 并且代码编译良好。 https://godbolt.org/z/y4f6wa

      #include <type_traits>
      template<typename T, class T2>
       class ENABLE{
            static_assert(std::is_arithmetic<T>::value);
       public:
           T a;
           ENABLE(T b): a(b) {};
       };
      
      template<typename T, class T2>
       class ENABLE_CHILD : public ENABLE<T, T2> {
           static_assert(std::is_arithmetic<T>::value);
       public:
          ENABLE_CHILD(T x): ENABLE<T, T>(x) {};
          bool FOO(auto a);
       };
      
      template<typename T, class T2>
       bool ENABLE_CHILD<T, T2>::FOO(auto a) { return(1); };
      
       int main(){
           ENABLE_CHILD<int,int> theEC(42);
           
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-10
        • 1970-01-01
        • 2017-09-28
        相关资源
        最近更新 更多