【发布时间】:2020-07-09 12:51:54
【问题描述】:
我正在学习 C++ 模板元编程,偶然发现了一个与 SFINAE 相关的简单问题(我相信如此)。特别是,我正在编写一个模板类,它将为我们提供最大尺寸的类型。我通过将类型与sizeof 运算符进行比较,将type 别名为正确的类型,具体取决于它们的大小。我正在使用enable_if 选择正确的类专业化。我不明白的是为什么在声明要使用enable_if 专门化的类模板时,需要将void 作为class Enable 的默认值提供。
以下代码可以正常工作
// test.cpp
#include <type_traits>
// void works just fine but if changed to anything else say int, compilation fails!
template < typename L, typename R, class Enable = void > struct MaxTypeT;
template < typename L, typename R >
struct MaxTypeT<L, R, typename std::enable_if< (sizeof(L) >= sizeof(R)) >::type> {
using type = L;
};
template < typename L, typename R >
struct MaxTypeT<L, R, typename std::enable_if< (sizeof(L) < sizeof(R)) >::type> {
using type = R;
};
int main(){
static_assert(std::is_same< MaxTypeT<int, double>::type, double >::value, "MaxTypeT not working");
return 0;
}
但是当我将class Enable = void 更改为任何其他类型比如class Enable = int 时,我会收到以下错误。为什么这里需要void?
test.cpp: In function ‘int main()’:
test.cpp:17:56: error: incomplete type ‘MaxTypeT<int, double>’ used in nested name specifier
static_assert(std::is_same< MaxTypeT<int, double>::type, double >::value, "MaxTypeT not working");
^~~~
test.cpp:17:56: error: incomplete type ‘MaxTypeT<int, double>’ used in nested name specifier
test.cpp:17:69: error: template argument 1 is invalid
static_assert(std::is_same< MaxTypeT<int, double>::type, double >::value, "MaxTypeT not working");
【问题讨论】:
标签: c++ c++11 templates template-meta-programming enable-if