使用 std::enable_if 限制派生类的模板参数时出现编译错误

Compilation error when restricting template parameters of derived class with std::enable_if

本文关键字:参数 错误 编译 enable std if 派生 使用      更新时间:2023-10-16

编译:

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. 错误:未使用不完整的类型"类 ENABLE_CHILD<T、T2>"无效
  2. 注意:声明"类ENABLE_CHILD<T,T2>(单击此声明将我带到声明声明(

所以我的编译器认为该类不完整。关于如何解决这个问题的任何想法?提前谢谢。

将此代码粘贴到 godbolt.org 时出现不同的错误。您还需要在成员函数定义中包含第三个模板参数:https://godbolt.org/z/kxpvQt

模板<类型名称>bool ENABLE_CHILD<T,>::FOO(auto a( { return(1(; };

我不知道你是否想到了别的东西 T 不应该是算术类型,但我用 static_asserts 替换了enable_ifs,代码编译得很好。 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);

}