类型特征的模板别名不起作用
Template alias for type trait doesn't work
我正在通过一个简单的自定义类型特征练习 SFINAE:
#include <iostream>
#include <type_traits>
struct A{ int i, j; };
// Type trait
template<typename T>
struct is_class_A{ static const bool value = false; };
template<>
struct is_class_A<A>{ static const bool value = true; };
// (1)
template <typename T>
std::enable_if_t<is_class_A<T>::value> foo(const T& t){
puts("Hi!\n");
}
int main() {
A a;
foo(a); // allowed
//foo(1); // not allowed
}
按预期工作。但是,使用模板别名
template <typename T>
using is_class_A_v = is_class_A<T>::value;
// (1)
template <typename T>
std::enable_if_t<is_class_A_v<T>> foo(const T& t){
puts("Hi!\n");
}
产生编译器错误:
<source>:37:22: error: missing 'typename' prior to dependent type name 'is_class_A<T>::value'
using is_class_A_v = is_class_A<T>::value;
^~~~~~~~~~~~~~~~~~~~
typename
<source>:40:18: error: template argument for non-type template parameter must be an expression
std::enable_if_t<is_class_A_v<T>> foo(const T& t){
另一方面,通过使用
template <typename T>
using is_class_A_v = typename is_class_A<T>::value;
我收到错误信息
error: template argument for non-type template parameter must be an expression
std::enable_if_t<is_class_A_v<T>> foo(const T& t){
^~~~~~~~~~~~~~~
我在这里错过了什么?
模板变量语法为:
template <typename T> const bool is_class_A_v = is_class_A<T>::value;
我正在通过一个简单的自定义类型特征练习 SFINAE:
#include <iostream>
#include <type_traits>
struct A{ int i, j; };
// Type trait
template<typename T>
struct is_class_A{ static const bool value = false; };
template<>
struct is_class_A<A>{ static const bool value = true; };
// (1)
template <typename T>
std::enable_if_t<is_class_A<T>::value> foo(const T& t){
puts("Hi!\n");
}
int main() {
A a;
foo(a); // allowed
//foo(1); // not allowed
}
按预期工作。但是,使用模板别名
template <typename T>
using is_class_A_v = is_class_A<T>::value;
// (1)
template <typename T>
std::enable_if_t<is_class_A_v<T>> foo(const T& t){
puts("Hi!\n");
}
产生编译器错误:
<source>:37:22: error: missing 'typename' prior to dependent type name 'is_class_A<T>::value'
using is_class_A_v = is_class_A<T>::value;
^~~~~~~~~~~~~~~~~~~~
typename
<source>:40:18: error: template argument for non-type template parameter must be an expression
std::enable_if_t<is_class_A_v<T>> foo(const T& t){
另一方面,通过使用
template <typename T>
using is_class_A_v = typename is_class_A<T>::value;
我收到错误信息
error: template argument for non-type template parameter must be an expression
std::enable_if_t<is_class_A_v<T>> foo(const T& t){
^~~~~~~~~~~~~~~
我在这里错过了什么?
模板变量语法为:
template <typename T> const bool is_class_A_v = is_class_A<T>::value;