我正在关注 template class restriction ,但在 gcc 中遇到错误:
错误:一个声明中有多个类型
错误:声明没有声明任何东西
如果我删除 enable_if block ,它会编译。如果我遗漏了什么,谁能解释一下?
template<class A, class B, class C, class D>
typename std::enable_if<
std::is_base_of<baseofA, A>::value &&
std::is_base_of<baseofB, B>::value &&
std::is_base_of<baseofC, C>::value &&
std::is_base_of<baseofD, D>::value>::type
class library {
//whatever
};
最佳答案
您没有正确使用 enable_if
。 static_assert
在这种情况下会更合适。
template<class A, class B, class C, class D>
class library {
static_assert(
std::is_base_of<baseofA, A>::value &&
std::is_base_of<baseofB, B>::value &&
std::is_base_of<baseofC, C>::value &&
std::is_base_of<baseofD, D>::value,
"template argument A must derive from baseofA and so on ..." );
//whatever
};
如果您想使用 enable_if
而不是,您必须创建一个虚拟模板参数,该参数取决于启用的类型,以便它按您的期望工作。
template<class A,
class B,
class C,
class D,
class _ =
typename std::enable_if<
std::is_base_of<baseofA, A>::value &&
std::is_base_of<baseofB, B>::value &&
std::is_base_of<baseofC, C>::value &&
std::is_base_of<baseofD, D>::value>
::type>
class library {
//whatever
};
但是 IMO,static_assert
方法更好,因为您可以提供描述性错误消息,而不是编译器在后一种情况下提示未能找到名为 type
的类型.
关于c++将多个模板类类型限制为派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10989956/