我有一个包含布尔模板参数can_fly
的类模板void fly();
。根据该值,我想启用带有签名#include <type_traits>
template<bool can_fly>
class Bird {
public:
template<typename void_t = typename std::enable_if<can_fly>::type>
void_t fly() { /* ... */ }
};
int main() {
Bird<true> flyingBird;
flyingBird.fly();
Bird<false> flightlessBird;
return 0;
}
的成员函数。
这是我的代码:
main
此代码在Visual Studio 2015中编译得很好,但是GCC抱怨说&#34; 没有名为&#39; type&#39;在&#39; struct std :: enable_if&#39; &#34;在::type
的第三行。
我认为false
案例中没有<svg>
这一事实是SFINAE的全部观点。有人可以向我解释我做错了什么以及正确的做法是什么?
答案 0 :(得分:1)
enable_if有效,因为替换模板参数会导致错误,因此从重载决策集中删除了替换,并且编译器只考虑其他可行的重载。
在您的情况下,没有替换因为can_fly
在实例化时已知。您可以创建虚拟默认bool
模板参数,以使SFINAE正常工作:
template<bool can_fly>
class Bird {
public:
template<bool X = can_fly, typename = typename std::enable_if<X>::type>
void fly() { /* ... */ }
};