首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型特性的模板别名无效

类型特性的模板别名无效
EN

Stack Overflow用户
提问于 2021-05-11 15:12:25
回答 1查看 56关注 0票数 0

我正在通过一个简单的定制类型特征来练习SFINAE:

代码语言:javascript
复制
#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
}

按预期工作。但是,使用模板别名

代码语言:javascript
复制
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");
}

生成编译器错误:

代码语言:javascript
复制
<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){

另一方面,通过使用

代码语言:javascript
复制
template <typename T>
using is_class_A_v = typename is_class_A<T>::value;

我得到了错误消息

代码语言:javascript
复制
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){
                 ^~~~~~~~~~~~~~~

我在这里错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-11 18:05:52

模板变量语法如下:

代码语言:javascript
复制
template <typename T> const bool is_class_A_v = is_class_A<T>::value;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67489581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档