考虑以下示例:
#include <type_traits>
template <typename T, typename Enable = void>
struct A;
template <typename T>
constexpr bool f() { return true; }
template <typename T>
struct A<T, std::enable_if_t<f<T>()>> {};
int main() {
A<int> f;
}
使用clang和gcc但MSVC gives the following error编译正常:
13 : <source>(13): error C2079: 'f' uses undefined struct 'A<int,void>'
这是MSVC或代码中的错误,我该如何解决?
答案 0 :(得分:3)
我几乎完全确定这是一个MSVC错误。
某些测试显示MSVC只是拒绝与专用模板匹配,提供定义并且主模板中的static_assert
可用于验证此。
在弹出一些this之后,显然在sfinae构造中使用了类型,但不知道是不是函数。
最终结果是this workaround,这有点令人讨厌,但主要是可忍受的
#include <type_traits>
template <typename T, typename = void>
struct A;
template <typename T>
struct f
{
constexpr operator bool() {return true;}
};
template <typename T>
struct A<T, std::enable_if_t<(f<T>())>> {}; // note braces
int main()
{
A<int> a;
}