首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

向函数传递枚举值时出现C++17错误:“‘.token’前应有主表达式”

首先,C++17引入了一项新的特性,即非类型模板参数的类型推导。这使得我们能够将枚举值作为模板参数进行传递。但是,如果你在使用非类型模板参数的类型推导时遇到了错误信息"'token'前应有主表达式",这可能是由于你在函数调用中出现了错误。

在C++17之前,将枚举值作为模板参数传递时,我们需要使用枚举类型的名称作为参数类型,而不是具体的枚举值。例如:

代码语言:txt
复制
enum class MyEnum {
    Value1,
    Value2,
    Value3
};

template <MyEnum EnumValue>
void MyFunction() {
    // 在这里使用枚举值
}

int main() {
    MyFunction<MyEnum::Value1>();  // 正确的方式
    // MyFunction<MyEnum::Value1>;   // 错误,需要提供具体的枚举值
    return 0;
}

然而,在C++17中,我们可以直接传递具体的枚举值作为模板参数,而不需要使用枚举类型的名称。例如:

代码语言:txt
复制
enum class MyEnum {
    Value1,
    Value2,
    Value3
};

template <auto EnumValue>
void MyFunction() {
    // 在这里使用枚举值
}

int main() {
    MyFunction<MyEnum::Value1>();  // 正确的方式,C++17引入的新特性
    return 0;
}

如果你在使用C++17的非类型模板参数类型推导时遇到错误"'token'前应有主表达式",可能是由于你在函数调用时的语法错误。请确保你使用了正确的函数调用语法,并且在模板参数中传递了有效的枚举值。

对于腾讯云相关产品和产品介绍链接地址的推荐,我无法直接提供,因为你要求答案中不能涉及云计算品牌商。但你可以通过访问腾讯云的官方网站,查找他们的云计算产品和相关文档,以获取更多信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c++17好用的新特性总结

inline变量出现后,我们可以直接将全局变量定义在头文件中,而不用担心出现redefine的错误信息。...有兴趣的朋友可以看看下面两篇文章: 《c++ inline variable 内联变量 c++17》 《GCC,Clang 在C模式,较低优化等级下,链接器对内联函数报未定义错误,为什么?》...常用于可能失败的函数的返回中,比如工厂函数。在C++17之前,往往使用T*作为返回,如果为nullptr则代表函数失败,否则T*指向了真正的返回。...通过使用std::variant,用户可以实现类似Rust的std::result,即在函数执行成功返回结果,在失败返回错误信息,上文的例子则可以改成。...bool 表达式不能用 ++, – 这两个自增(减)运算符了 c++17中异常已经成为了类型系统的一部分, 枚举的直接列表初始化 结构化绑定 constexpr if 表达式

3.2K10
  • C++17中新特性

    inline变量出现后,我们可以直接将全局变量定义在头文件中,而不用担心出现redefine的错误信息。 4....条件表达式中支持初始化语句 c++17中支持在 if 或者switch 语句中进行初始化, 这个能力的出现能够让代码更加的简洁。...当我们通过函数创建一个对象,通常使用通过函数返回错误码,而通过出参返回对象本身。...,不存在则抛出 std::bad_optional_access 异常 value_or() // 存在返回,不存在返回默认 3. std::any 一个类型安全的可以保存任何的容器...bool 表达式不能用 ++, -- 这两个自增(减)运算符了 c++17中异常已经成为了类型系统的一部分, 枚举的直接列表初始化 结构化绑定 constexpr if 表达式 map支持merge和extract

    4.9K30

    C++17常用新特性(五)---强制省略拷贝或传递未实质化的对象

    本文主要包含两个方面: 1、从技术上的角度说,通过技术演进减少拷贝或者临时对象传递对象的拷贝构造; 2、从效果上说实际上是传递了一个没有进行实质化的对象。...从C++17起,上面的代码就可以编译通过了,因为C++17直接强制在临时对象中强制省略了对象的拷贝。但是,C++17还不都彻底,当代码中包含一个具名的变量并作为返回依然会调用拷贝构造函数。...: 主要是描述对象或函数位置的表达式。...在实际编程,prvalue 出现在需要 glvalue(lvalue 或者 xvalue)的地方都是有效的,它通过创建一个临时对象prvalue,并用该临时对象完成的初始化。...4 未实质化的返回传递返回临时对象 (prvalue) 的过程都是在传递未实质化的返回,主要有以下场景: 函数返回一个常量值 int func() { return 38; } 以auto

    1.2K20

    【笔记】《深入理解C++11》(下)

    可以在函数声明, 但是C++11的时候常量表达式函数有很多限制, 后来的版本渐渐放松限制....C++11的时候: 函数体只能有单一的return语句(或者额外的不影响数据的编译期语句) 函数必须返回, 因为一定要从常量表达式中获得常量 函数使用(编译期)一定要有定义 返回语句中不能有非常量的函数或数据...必须是个常量表达式 常量表达式必须在使用初始化, 但是如果没有代码用到其地址, 编译器可以不生成数据, 直接将常量表达式作为编译时期的使用 编译浮点常量表达式的精度至少要等于/高于运行时浮点数常量的精度...为了保证线程中的程序运行既能发挥优化的高效率又能拥有正确的顺序, C++11对底层硬件抽象出了一系列枚举, 这些枚举称为C++的内存模型 C++11中, 原子类型变量本身已经满足多线程的同步特性,..., 描述函数参数是如何压入栈和由谁平衡栈的约定, 直接将其写在函数名和返回之间的位置 平衡栈: 函数返回由谁负责将压入栈的函数参数清除 函数调用过程: 根据调用约定把函数参数压栈或存入寄存器 跳转到函数代码

    1.1K30

    Modern c++快速浅析

    可见引用性在型别推导的过程中被忽略•template void func(T param);在这个示例函数中,我们面临的是传递的情景,如果传递进的是一个const int&的对象...处理变量,它与auto不同,并不会去忽略掉顶层const,原变量是啥它就是啥•当decltype处理函数,它只是获取函数的返回类型,并不会去调用函数•当decltype处理表达式,假设类型为Tstd...,则推导出T•若表达式类型为左:若表达式只是变量名,则推导出T;其他情况推导出T&•若表达式类型为将亡,则推导出T&&•当decltype处理Lambda表达式auto f = [](int...enum class 普通的枚举类型是不限定作用域的,即在同一个namespace中,是不能出现重名的,且能够被隐式转换为int等类型的 ;强枚举类型(enum class)的枚举类型是唯一的,但仍可以显示强转为...Lambda表达式 Lambda表达式其实是块语法糖,其结构如下 [函数对象参数](函数参数列表) mutable throw(类型)->返回类型 { 函数语句 }; •当捕获的是this,lambda

    17910

    C++17常用新特性(六)---lambda表达式的扩展

    从C++11起就引入了lambda表达式,C++14又对其进行了丰富,开始支持使用泛型lambda。到现在的C++17 lambda的功能又进行了扩展。...在C++17新特性中,主要支持了以下两种场景: 在常量表达式中使用 需要对当前对象的拷贝使用,如不同的线程需要创建不同的对象。...1 constexpr lambda表达式C++17开始,lambda表达式会尽可能的隐式声明constexpr,在任何只使用有效的编译期上下文的lambda都有可能被用于编译期。...那么编译程序将会报错如下: 如此,按照上面上面编译场景,在确认一个lambda表达式是否可用于编译期就可以在表达式中使用constepr进行判断。...lambda 传递 this 的拷贝 在C++11或者C++14中,如果要捕获this,可以通过或者引用的方式进行。

    93320

    llvm入门教程-Kaleidoscope前端-2-解析器和AST

    调用此函数,该函数期望当前令牌是一个‘(’令牌,但在解析子表达式之后,可能没有‘)’在等待。例如,如果用户键入“(4x”而不是“(4)”),解析器应该会发出错误。...(如果当前Token是tok_Identifier令牌,则预期会被调用)。它还具有递归和错误处理功能。...运算符优先解析将其视为由二元运算符分隔的主表达式流。因此,它将首先解析前导主表达式“a”,然后将看到对[+,b][+,(c+d)][*,e][*,f]和[+,g]。...注意,因为括号是主表达式,所以二元表达式解析器根本不需要担心像(c+d)这样的嵌套子表达式。...在上面的示例中,代码将“a”的表达式传递给ParseBinOpRHS,当前令牌为“+”。 传入ParseBinOpRHS的优先级表示函数可以吃的最小算子优先级。

    1.8K30

    C++17常用新特性(八)---其他不常用语言特性

    ,"提示字符串"),主要是当表达式不成立时产生一条编译错误。...=1, "表达式需要相等"); return 0; } 编译编译器报错类型为: C++17后,静态断言发布了新的版本,提示字符串可以进行省略。...=1); return 0; } 编译,编译器会提示错误,但是具体的提示信息不是用户定义的,完全依赖平台。...7 异常声明作为类型的一部分 C++17之前的版本中,noexcep并不作为类型的一部分,因此声明相同参数和返回类型的函数,无论有没有加上这个关键字,两个函数类型其实是等价的,但是这种情况从C++17...void fFunThrow(); void fFunNoexcept() noexcept; // 不 同 类 型 在C++17可以通过同一个函数指针进行使用,但是之后,如果使用同一个函数指针分别指向这两个函数

    71520

    C++17 在业务代码中最好用的十个特性

    &value]{         std::cout << key << ": " << value << std::endl;     }(); } 在 clang 环境下,可以在 lambda 表达式捕获显式引入一个引用变量通过编译...std::tuple 的隐式推导 在 c++17 以前,构造std::pair/std::tuple必须指定数据类型或使用std::make_pair/std::make_tuple函数c++17...常用于可能失败的函数的返回中,比如工厂函数。在 C++17 之前,往往使用T*作为返回,如果为nullptr则代表函数失败,否则T*指向了真正的返回。...通过使用std::variant,用户可以实现类似 Rust 的std::result,即在函数执行成功返回结果,在失败返回错误信息,上文的例子则可以改成: std::variant...总结 以上是笔者在生产环境中最常用的 c++17 特性,除了本文描述的十个特性外,c++17 还添加了如lambda 捕获*this, 钳夹函数 std::clamp(), 强制检查返回[[nodiscard

    2.6K20

    每个开发者都应该了解的一些C++特性

    今天,我们深入发掘一下每位开发者都应该了解的新特性(这些新特性从 C++11 开始出现,距今已有八年历史了)。注意,本文略过了一些高级特性,可能会在以后的内容中详细探讨。...最后,就像前面提到的,当你使用复杂的数据类型,编译器推断数据类型会非常有用。 ? 不要忘记查看第 25 行!表达式 auto [v1,v2] = itr.second 是 C++17 的新特性。...由于我们声明 fibonacci 计算函数为 constexpr,编译器会在编译预先计算 fib(20) 的。...这是声明为 constexpr 的函数非常重要的一点,传递的参数同样要是 constexpr 或者 const。否则,该函数会像普通函数一样执行,即不会在编译预先计算。...否则,会出现编译错误。 有趣的是,在之后的 c++17 中,又引入了 constexpr-if 和 constexpr-lambda。

    75720

    C++17常用新特性(七)---新的属性和属性特性

    ,还有一种是对于函数的返回没有进行判断等,在本文中,将主要对C++17新增的一些属性进行解释和说明。...在实际编码时下面这三种场景是使用[[nodiscard]]性价比最高的地方: 内存泄漏:在使用一些C语言的内存申请函数,如malloc和realloc函数,如果使用时内存已经申请,但是没有对返回进行恰当处理...异常的奇怪的行为:如果没有对函数的返回进行正确判断紧接着就进行了后面的操作,可能导致进程异常,如:获取对象实例的指针,如果没有成功就在后面的代码中进行使用,就会导致进程异常。...针对上面的场景,参考代码如下: [[nodiscard]] bool empty() const noexcept; 如上,在判断为空的函数使用了该属性,如果在后面的使用时没有对返回进行判断,编译器就会告警...该属性可以应用于类的声明、使用typedef 或者 using 定义的类型、变量、非静态数据成员、函数枚举类型、枚举等场景。

    1.3K20

    听GPT 讲Rust源代码--srctools(17)

    ExpandMacro结构体:它代表宏处理器请求扩展宏的消息。它包含了要扩展的宏的名称以及传递给宏的输入参数。 Message trait:定义了一系列与通信消息相关的方法。...这些方法和函数可以用于创建、处理和显示语法错误。 SyntaxError结构体主要起到了承载和传递语法错误信息的作用。...每个节点类型都有一个唯一的SyntaxKind,以便工具可以轻松地识别和操作不同类型的节点。 ParseError:它是解析过程中可能出现错误类型。...这些结构体提供了一种在IDE合一(SSR)功能中记录和处理错误的机制,它们被设计为在执行SSR操作过程中捕获和传递错误,以便在必要进行处理和提供错误信息。...整体而言,errors.rs文件定义了一些用于处理SSR操作中可能出现错误情况的数据结构和相关函数

    13010

    一千行 MySQL 详细学习笔记

    枚举在保存,以2个字节的整型(smallint)保存。每个枚举,按保存的位置顺序,从1开始逐一递增。 表现为字符串类型,存储却是整型。 NULL的索引是NULL。...-- 3NF, 第三范式 满足第二范式的前提下,不能出现传递依赖。 某个字段依赖于主键,而有其他字段依赖于该字段。这就是传递依赖。...-- 表达式由运算符和运算数组成。 -- 运算数:变量(字段)、函数返回 -- 运算符: =, , , !...- 只有数据存在才能发送连接。即连接结果不能出现空行。 on 表示连接条件。其条件表达式与where类似。也可以省略条件(表示条件永远为真) 也可用where表示连接条件。....; 可以指定在插入的出现主键(或唯一索引)冲突,更新其他非主键列的信息。

    2.6K30

    一千行 MySQL 详细学习笔记(值得学习与收藏)

    枚举在保存,以2个字节的整型(smallint)保存。每个枚举,按保存的位置顺序,从1开始逐一递增。 表现为字符串类型,存储却是整型。 NULL的索引是NULL。...-- 3NF, 第三范式 满足第二范式的前提下,不能出现传递依赖。 某个字段依赖于主键,而有其他字段依赖于该字段。这就是传递依赖。...-- 表达式由运算符和运算数组成。 -- 运算数:变量(字段)、函数返回 -- 运算符: =, , , !...- 只有数据存在才能发送连接。即连接结果不能出现空行。 on 表示连接条件。其条件表达式与where类似。也可以省略条件(表示条件永远为真) 也可用where表示连接条件。....; 可以指定在插入的出现主键(或唯一索引)冲突,更新其他非主键列的信息。

    2.8K20

    MySQL 详细学习笔记

    枚举在保存,以2个字节的整型(smallint)保存。每个枚举,按保存的位置顺序,从1开始逐一递增。 表现为字符串类型,存储却是整型。 NULL的索引是NULL。...-- 3NF, 第三范式 满足第二范式的前提下,不能出现传递依赖。 某个字段依赖于主键,而有其他字段依赖于该字段。这就是传递依赖。...-- 表达式由运算符和运算数组成。 -- 运算数:变量(字段)、函数返回 -- 运算符: =, , , !...- 只有数据存在才能发送连接。即连接结果不能出现空行。 on 表示连接条件。其条件表达式与where类似。也可以省略条件(表示条件永远为真) 也可用where表示连接条件。....; 可以指定在插入的出现主键(或唯一索引)冲突,更新其他非主键列的信息。

    1.5K50

    一千行 MySQL 详细学习笔记

    枚举在保存,以2个字节的整型(smallint)保存。每个枚举,按保存的位置顺序,从1开始逐一递增。 表现为字符串类型,存储却是整型。 NULL的索引是NULL。...-- 3NF, 第三范式 满足第二范式的前提下,不能出现传递依赖。 某个字段依赖于主键,而有其他字段依赖于该字段。这就是传递依赖。...-- 表达式由运算符和运算数组成。 -- 运算数:变量(字段)、函数返回 -- 运算符: =, , , !...- 只有数据存在才能发送连接。即连接结果不能出现空行。 on 表示连接条件。其条件表达式与where类似。也可以省略条件(表示条件永远为真) 也可用where表示连接条件。....; 可以指定在插入的出现主键(或唯一索引)冲突,更新其他非主键列的信息。

    2.4K20

    1000行 MySQL 学习笔记,不怕你不会,就怕你不学!

    枚举在保存,以2个字节的整型(smallint)保存。每个枚举,按保存的位置顺序,从1开始逐一递增。 表现为字符串类型,存储却是整型。 NULL的索引是NULL。...-- 3NF, 第三范式 满足第二范式的前提下,不能出现传递依赖。 某个字段依赖于主键,而有其他字段依赖于该字段。这就是传递依赖。...-- 表达式由运算符和运算数组成。 -- 运算数:变量(字段)、函数返回 -- 运算符: =, , , !...- 只有数据存在才能发送连接。即连接结果不能出现空行。 on 表示连接条件。其条件表达式与where类似。也可以省略条件(表示条件永远为真) 也可用where表示连接条件。....; 可以指定在插入的出现主键(或唯一索引)冲突,更新其他非主键列的信息。

    1.7K40
    领券