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

为什么不能在function中使用模板别名作为参数并自动推导?

在函数中使用模板别名作为参数并自动推导是因为模板别名本质上是一个类型别名,而函数参数需要在编译时确定类型。模板别名只是为一个已有类型定义了一个新的名称,它本身并不是一个具体的类型,因此无法在函数参数中使用并进行类型推导。

函数参数的类型推导是通过编译器根据传入的实参类型来确定的,而模板别名并不能提供具体的类型信息。如果在函数参数中使用模板别名,编译器无法确定具体的类型,从而无法进行类型推导。

举个例子,假设有以下模板别名定义:

代码语言:txt
复制
template<typename T>
using MyAlias = std::vector<T>;

如果尝试在函数中使用模板别名作为参数并自动推导:

代码语言:txt
复制
template<typename T>
void myFunction(MyAlias<T> param) {
    // do something
}

编译器无法根据传入的实参类型来确定MyAlias<T>的具体类型,因为MyAlias<T>只是一个别名,并不提供具体的类型信息。因此,编译器无法进行类型推导,导致无法编译通过。

解决这个问题的方法是,在函数参数中直接使用具体的类型,而不是模板别名。例如:

代码语言:txt
复制
template<typename T>
void myFunction(std::vector<T> param) {
    // do something
}

这样编译器就可以根据传入的实参类型来确定参数的具体类型,从而进行类型推导和编译。

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

相关·内容

【笔记】C++2.0新特性

; // 等价于 std::vector> foo; 模板别名能在特定情境下发挥作用, 核心就是它可以在编译阶段将模板参数数量整合缩减....由于编译器无法在模板推导模板参数的正确形式, 也就是模板参数的默认值在编译阶段是无法展现的....和Lambda, 替代了旧版本不好用的typeof 返回值: 在模板编程, 我们不仅希望能自动推导参数类型, 还希望按照得到的类型来推导返回值, 如今可以借助尾置返回将模板函数写为下面的形式....尾置返回也是C++11新加入的特性, 其目的是让参数列表的符号也可以在返回值推导使用....auto Foo(T1 x, T2 y)->decltype(x+y) {dosomething;} TMP: 在模板元编程, decltype主要用来自动推导参数的类型, 从而利用这个类型进行其它的变量使用

87220

C++从入门到精通——auto的使用

例如: int num = 10; auto& ref = num; // ref的类型将被推导为int& auto还可以与模板一起使用,用于自动推导模板类型。...double return 0; } 需要注意的是,auto只能在局部变量中使用,不能用于函数的参数、返回类型和全局变量的声明。...二、auto简介 在早期C/C++auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么?...lambda表达式 C++的lambda表达式是一种匿名函数的方式,它可以在需要函数作为参数的地方使用,也可以用于定义临时的函数对象。...该lambda表达式接受两个整数作为参数返回它们的和。 lambda表达式的捕获列表([ ])可以用来捕获局部变量,以供lambda表达式内部使用

23710

Modern c++快速浅析

在C++11,Lambda表达式的参数需要具体的类型声明 auto MyLambda = [](int a, int b) { return a + b; }; auto用于Lambda表达式时,同样代表遵循模板类型推导的原则...,例如C++11可以将其用于匿名函数参数推导 // 使用auto接住匿名函数,匿名函数使用auto进行参数推导,匿名函数的返回值使用auto推导 auto MyLambda = [](auto a...对于非模板类型参数而言,使用auto进行自动推断会方便很多 template auto是可选项而不是必选项 •对于部分情景而言,使用auto能够避免不少低级错误,如Effective...•但是过量使用auto会导致代码的可读性降低;同时由于是编译器自动推导,各种类型忽略问题以及转换问题我们都需要重视以std::vector为例,std::vector是std::...decltype(auto) 上文中提到auto作为返回值时将采用模板类型推导的规则,正因为如此它可能会遗失一些我们需要的类型(如引用或常量性),这个时候就需要使用decltype(auto) template

15810

《Effective Modren C++》 进阶学习(上)

理解模板类型推导 模板类型推导(template type deduction)指的是编译器通过函数参数的类型来推断模板参数的类型,从而确定函数模板的实例化类型。...某些情况下,ParamType并不是和函数参数类型一样,而是依据参数推导出的(划重点) 使用模板: template void f(ParamType param); // ParamType...类型明确可推导: 当变量的初始化表达式明确地指示了变量的类型时,使用auto可以简化代码,减少重复输入类型名称的工作。这对于使用迭代器、范围基于循环或返回自动类型推导函数的函数等情况特别有用。...作为对比,使用参数的构造函数。 Widget w1(10); // 没问题,使用实参10调用Widget的一个构造函数 需要初始化一个无参数的构造函数对象时,会变成函数声明。...constexpr常量可以在编译时被用作常量表达式,例如作为数组大小、模板参数或其他需要常量表达式的上下文中使用。这样可以提高代码的灵活性和可读性。 编译时错误检查。

17020

C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

它通常与 auto 结合使用,用于声明变量的类型或者作为模板参数推断的一部分。...万能引用的语法是 T&&,其中 T 是模板类型参数。当万能引用绑定到一个右值时,它被推导为右值引用;当绑定到一个左值时,它被推导为左值引用。...在 C++ ,可变参数模板通常使用模板参数包(template parameter pack)来实现。...模板参数包允许在模板参数列表接受任意数量的参数通过展开(expansion)来处理这些参数。...C++function本质是一个类模板function可以封装他们,目标是统一类型,统一后我们能传给各种容器使用,函数指针的话类型复杂、仿函数的类型不同、Lambda表达式没有类型。

5900

浅谈 C++ 元编程

元编程经过编译器推导得到的程序,再进一步通过编译器编译,产生最终的目标代码。在使用 if 进行编译时测试,用一个例子说明了两者的区别。...1.4.1 狭义的模板 目前最新的 C++ 将模板分成了 4 类:类模板 (class template),函数模板 (function template),别名模板 (alias template) ...类模板 和 函数模板 分别用于定义具有相似功能的 类 和 函数 (function),是泛型对 类型 和 算法 的抽象。...类型推导的例子(代码)使用 std::tuple 作为参数,然后通过匹配的方法,提取 std::tuple 内部的变长参数。...(类似于 C 语言里的回调机制,不能在函数内定义回调函数,需要通过参数传递上下文。)

2.9K60

查看自动类型推导结果的方法

在《深入解析C++的auto自动类型推导》和《深入解析decltype和decltype(auto)》两篇文章中介绍了使用auto和decltype以及decltype和auto结合来自动推导类型的推导规则和用法...使用的界面如下:(点击查看大图)左边是我们输入的原始代码,输入结束之后点击左上角的三角形按钮,就会生成右边经过转换后的代码,可以看到右边已经将类型别名T1到T10等的类型转换成具体的类型了,使用时可以在上面的下拉列表框中选择不同的...这时可以采用另外一种手段来输出变量的类型,跟上小节的例子一样借助模板的技术,实现一个模板函数,在模板函数利用编译器提供的宏,把这个函数的原型打印出来,函数原型中就包含了函数的参数个数及其类型,这个宏由于不是...C++标准定义的,是由各编译器扩展的,因此名称不一样,在GCC/Clang是__PRETTY_FUNCTION__,在微软的MSVC是__FUNCSIG__,如下代码:#include void dumpType() { // GCC/Clang使用这行 std::cout << __PRETTY_FUNCTION__ << std::endl; // MSVC

7710

【C++11】让程序更简洁——模板

二、模板别名 在C98,可以使用typedef重定义一个类型,如: typedef unsigned int uint_t; 在上面的代码无符号整型类型被重新定义,但并不是新增一种类型,只是给已存在的类型重新定义了一个别名...如: func(123);//func的返回值为long long 还有一种使用方式是将函数模板默认参数模板参数自动推导一起使用,在一起使用时,如果函数模板无法自动推导,将会使用默认模板参数...,否则将使用自动推导出的参数类型。...通过identity禁用了val的自动推导,但因为指定了默认参数模板类型,因此,在func(123),func的val参数将为int整型,在func(123,123.0),第二个参数为浮点行,模板参数...T将优先被推导自动推导生效时,默认模板参数会被直接忽略。

65130

C++11新特性学习笔记

终端:g++ xxx.cpp -std=c++11 类型推导 auto auto的自动类型推导,用于从初始化表达式推断出变量的数据类型。...在 C++11 ,它可以自动推导出更复杂的类型,包括带类型指针、带有默认构造函数的对象类型等。此外,auto 还可以用作迭代器的类型推导,以及在泛型编程时的模板类型推导。...因此,在C语言中,可以在定义局部变量时省略auto关键字,直接使用int或其他数据类型。 C++的auto是类型推导关键字,用于自动推导变量的类型,可以简化代码并且提高代码可读性。...完美转发就是在参数传递过程,所有这些属性和参数值都不能改变,同时,而产生额外的开销,就好像转发者不存在一样。在泛型函数,这样的需求非常普遍。...除去在语法层面上的不同,lambda和仿函数有着相同的内涵——都可以捕获一些变量作为初始化状态,接受参数进行运行。

2K20

C++11新特性学习笔记

终端:g++ xxx.cpp -std=c++11 类型推导 auto auto的自动类型推导,用于从初始化表达式推断出变量的数据类型。...在 C++11 ,它可以自动推导出更复杂的类型,包括带类型指针、带有默认构造函数的对象类型等。此外,auto 还可以用作迭代器的类型推导,以及在泛型编程时的模板类型推导。...因此,在C语言中,可以在定义局部变量时省略auto关键字,直接使用int或其他数据类型。 C++的auto是类型推导关键字,用于自动推导变量的类型,可以简化代码并且提高代码可读性。...完美转发就是在参数传递过程,所有这些属性和参数值都不能改变,同时,而产生额外的开销,就好像转发者不存在一样。在泛型函数,这样的需求非常普遍。...除去在语法层面上的不同,lambda和仿函数有着相同的内涵——都可以捕获一些变量作为初始化状态,接受参数进行运行。

2.2K20

C++11

变量类型推导 3.1 为什么需要类型推导 我们平时在定义变量的时候,必须先知道他的变量类型才能定义,但是有时候我们并不知道其具体的类型,或者变量的类型太复杂了,这时就需要类型推导。...完美换发 完美转发是指在函数模板,完全依照模板参数的类型,将参数传递给函数模板调用的另外一个函数。...这样参数的原始类型就得到了保留。 我们再来了解一下万能引用: 1、模板的&&代表右值引用,而是万能引用,其既能接收左值又能接收右值。...包装器 11.1 function包装器 function包装器 也叫作适配器。C++function本质是一个类模板,也是一个包装器。...如此丰富的类型,可能会导致模板的效率低下! //为什么呢?

7910

【c++入门】引用详解 | auto的类型推导 | 范围for循环 | nullptr空指针

前言 上篇文章,对函数重载和内联函数的作用和特性使用,进行了精细的详解。 引用和指针混不清?引用的抽丝剥茧!还有不用写类型可以自动推导的关键字?for遍历竟然还有我们没见过的面孔!...但是,需要注意的是,如果函数内部不需要修改参数的值,传引用可能会导致意外的修改,因此需要谨慎使用。 ☁️值和引用作为返回值类型的性能比较 函数可以返回值或引用作为返回类型。...void foo(auto x); // 错误,auto 不能用于函数参数的类型声明 ⭐模板参数 模板参数的类型是在实例化时确定的,编译器无法在编译时推导模板参数的类型。...template void foo(auto x); // 错误,auto 不能用于模板参数的类型声明 ⭐类成员变量 类成员变量的类型是在类定义时确定的,编译器无法在编译时推导出类成员变量的类型...注意:以下代码就有问题,因为for的范围不确定,在函数参数使用数组作为参数时,会自动转换为指针类型。因此,int array[] 实际上是 int* array 的语法糖。

15510

C++11常用的一部分新特性

#include using namespace std; // Args是一个模板参数包,args是一个函数形参参数包 // 声明一个参数包Args...args,这个参数可以包含...0到任意个模板参数。...我们无法直接获取参数包args的每个参数的, 只能通过展开参数包的方式来获取参数的每个参数,这是使用可变模版参数的一个主要特 点,也是最大的难点,即如何展开可变模版参数。...返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。 {statement}:函数体。在该函数体内,除了可以使用参数外,还可以使用所有捕获到的变量。...包装器 function包装器 function包装器 也叫作适配器。C++function本质是一个类模板,也是一个包装器。

390110

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

由于static_assert()是静态的, 能在任何命名空间中使用, 因此最好写在外部作为提示防止用到局部变量 noexcept 和 noexcept()指明某函数不能抛出异常(若抛出则直接terminate...有了extern后编译器会自动删除重复的实例化模板, 不但节省内存还节省了多余的实例化时间 注意被其他文件调用的外部模板一定要在要用到的类实例化之前实例化 局部和匿名成员可以作为模板实参了, 但仍要注意匿名类型的声明不能在参数位置...因为模板不允许不同名称空间的名字在模板特化 C++11给namespace引入了inline关键字, 经过inline的名称会自动内联展开到上层, 从而破坏名称空间的封装 因此建议还是尽量用打开空间的方法使用...可行的保留计算匹配的精确度, 选择最佳匹配的候选函数作为结果 如果存在两个相同匹配等级的参数列, 优先保留普通函数 完全找不到匹配的函数或者产生二义性时, 引发error 这个尝试进行参数替换的过程编译器只发生..., 例如RTTI), 也就是能在模板实例化途中检查出参数具有某些性质.

1.8K20

Chapter 5: Rvalue References, Move Semantics, PF

::move的简化版本 template decltype(auto) move(T&& param) //返回值类型推导 { //标准库别名模板 using ReturnType...通用引用参数一般会对任何传入的参数产生匹配,但是如果通用引用是包含其他非通用引用参数参数列表的一部分,那么在非通用引用参数上的匹配会使得已经匹配的通用引用参数无效。这就是标签分发的基础。...同样,在将MinVals传递到模板函数fwd时,这个模板参数是一个引用,它本质上和指针是一样,只不过是一个会自动解引用的指针,那么在编译该函数时就需要对MinVals进行取地址,而MinVals此时并没有定义...但是上述行为实际上是依赖于编译器的,安全的做法是在cpp文件定义一次MinVals constexpr std::size_t Widget::MinVals; 重载函数名和模板名的自动推导 一个模板函数接收重载函数作为参数时...fwd不知道该匹配哪一个重载函数 fwd(processVal); 如果将模板函数作为模板函数的参数,同样也无法自动推导出匹配的函数,因为模板函数不是一个函数,而是许多函数 template<typename

5.1K40

C++11『右值引用 ‖ 完美转发 ‖ 新增类功能 ‖ 可变参数模板

时,模板 是否能正确推导呢 下面这段代码的含义是 分别传入 左值、const 左值、右值、const 右值,设计对应参数的回调函数,将参数传给模板,看看模板是否能正确回调函数 void func(int...,可以将函数参数类型写为 T&&,因为模板具有自动推导的特性,当传入的参数为 左值 时,触发 引用折叠 机制,实际参数类型会变为 T&;当传入的参数为 右值 时,正常使用 T&& 就行了 这一机制在模板称为...当然不是,模板 是根据我们传入的参数类型,来推导出相应的函数,如果说 模板 推导没有问题,那问题就出在 回调函数 的参数上了,只有推导后,无论传的 左值 还是 右值,编译器都会把 val 变为 左值,这样才能解释为什么最终结果全部为...,需要指定模板参数类型 T,确保能正确推导传递 2.2.完美转发实际应用 完美转发 在实际开发中会经常用到,前面说过,在 C++11 之后,所有的类都可以新增一个 移动构造 以规避无意义的低效拷贝行为...的参数被成功解析了 因为是 递归 解析的,所以需要一个递归出口,也就是 参数为 void 的重载函数,推导逻辑如下 相关模板参数在编译阶段就已经全部推导出来了,也就是说当程序运行时,在当前代码,会同时存在

31350

理解TypeScript“类型”的概念到底有多难?

(color: Colors): void; 注意第一个export,倘若此处我们导出enum,那么我们在外部只能通过硬编码的形式传入字符串的red/blue/yellow,但当我们导出之后,就可以在外部使用...,但同时,我们也可以把它作为一个.ts文件进行使用使用时,通过declare声明的部分,不会被作为运行时进行编译。...所以,A&B表达的是这样的“交集”,而实际产生的结果是形状的“集”,这并不是矛盾的,而是推导结果。 纯类型编程 TS的类型系统几乎快要成为图灵完备的一门语言,你可以用它来写出一门新语言。...我们要理解的是,纯类型编程和作为JS超集的TS编程的边界。我们几乎不会只写类型,而写JS代码……等一下,真的不会吗?...简单讲,泛型是TS类型编程的“函数”,用以根据已有类型,按照给定推导路径,生成新的类型,可以简称为“类型生成函数”。泛型参数是TS中最有趣最灵活最强大最麻烦的存在。

1.2K30

以淘宝店铺为例,谈谈 TypeScript ESLint 规则集考量

另外,淘系技术部前端架构团队正在淘系内推广 AppLint,准备将 ESLint 推广到整个淘系前端作为 CI/CD 的卡口之一,欢迎集团的同学了解试用。...其支持的配置: 仅使用 Array 或 T[] 其中一种 对于原始类型与类型别名使用 T[],对于对象类型、函数类型等使用 Array(推荐) 为什么?...ban-types 禁止部分值被作为类型标注,此规则能够对每一种被禁用的类型提供特定的说明来在触发此规则报错时给到良好的提示,场景如禁用 {}、Function、object 这一类被作为类型标注, 为什么...no-unnecessary-type-arguments 不允许与默认值一致的泛型参数,如: function foo() {} foo(); 为什么:出于代码简洁考虑...推荐在规则配置仅开启 allowNumber 来允许数字,而禁止掉其他的类型,你所需要做得应当是在把这个变量填入模板字符串时进行一次具有实际逻辑的转化。

2.7K30
领券