问题标签 [template-argument-deduction]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
159 浏览

c++ - 解决模板参数推导中的模糊调用

一个典型的函数模板签名:

问题是,当我这样称呼它时:

或任何其他没有明确调用的方式

那么 T 的类型是int,并且存在溢出和错误结果的风险fn

那么我该如何专门fn化以便调用

是明确的并导致T设置为Iterator::value_type? 选择

导致来自 g++/clang++ 的模棱两可的调用错误。

编辑:

我现在看到了我的错误,上面的代码适用于下面的@Lightness Races 建议。谢谢您的帮助。

0 投票
1 回答
1665 浏览

c++ - Mixing variadic template values and variadic deduced types

Is the following perfectly defined by the standard ?

It compiles well under g++ 4.8 but I wonder if it is normal.

0 投票
5 回答
650 浏览

c++ - 使用模板模板参数进行参数推导

我有一个类模板。在这个类模板中,我试图定义一个成员函数模板,它接受const_iterators 集合上的strings。集合本身可以是任何类型的 StdLib 集合,但实际上它将是 avector或 a list

由于集合可以是任何类型,所以我使用一个template-template参数来指定集合类型。但是,它将始终是string. 我希望模板参数推导起作用,这样我就不必在调用成员函数时指定集合类型。

SSCCE 中后面的代码类似于我的预期用例。

到目前为止,我已经为类定义(Live Demo):

类模板的实例化编译成功:

然而,当我尝试利用论据推论(没有它,整个练习几乎毫无意义):

GCC 抱怨它无法推断出模板参数:

最终,我真正关心的是能够DoItstring. 集合的实际类型可以是vectorlist,我不想指定模板参数,也不想基于容器重载。

我怎样才能让它工作?

请注意,我的实际用例将使用 C++03。欢迎使用 C++11 解决方案,但我只能接受 C++03 解决方案。

0 投票
2 回答
474 浏览

c++ - c++ 模板友元运算符与另一个类似运算符

我有一个带有重载朋友运算符的模板。它工作得很好,但如果在一个范围内有另一个不相关但相似的运算符,它不会编译:g++ 产生奇怪的错误,icc 和 MSVC 产生类似的错误。

代码是:

gcc 4.8.1 的错误是(类似于 4.8.0 和 4.7.2):

icc 和 MSVC 会产生类似的错误(即尝试使用product<int>::typevia operator&for )。Tensor<int>

如果我更改代码以便product使用它或product2用于operator&Tensor取消注释注释行和注释运算符 [1]),则代码编译。

Tensor如果我用它完全删除类operator&,代码就会编译。

更新:完全删除m&m;行仍然使代码无法编译。


我看到许多消息来源建议写作,friend fvMatrix<Type> operator& <>即没有Type之间<>http://www.parashift.com/c++-faq-lite/template-friends.html,C++模板友元运算符重载),这确实解决了这个问题。

然而,即使是https://stackoverflow.com/a/4661372/3216312上的评论也使用friend std::ostream& operator<< <T>

所以,问题是:为什么上面的代码不能编译?写错friend fvMatrix<Type> operator& <Type>了,为什么?


背景:我们正在修改 OpenFOAM 框架,并在使用的原始 OpenFOAM 代码中遇到了这样的问题friend ... operator& <Type>http://foam.sourceforge.net/docs/cpp/a04795_source.html,第 484 行)。

0 投票
2 回答
231 浏览

c++ - 通过重载实现部分模板特化

我创建了一个简单的圆形模板函数,其中包含一个额外的模板参数,该参数定义了在返回之前需要将舍入值转换为的类型。

但我也希望有可能留下额外的模板参数,这样您就不必插入已经添加为参数的类型。

但是,现在编译器抱怨:

错误 C2668:对重载函数的不明确调用

我认为编译器总是会选择最具体的模板,应该是最后一个。为什么不是这种情况,是否有任何解决方法(不是专门针对此轮函数)?


模棱两可的电话不是指向,round(5.5)而是指向return round<T>(val);. 因此,这个问题的答案是将重载函数的返回值重写为

这解决了这个问题。

感谢galop1n回答我的另一个问题

0 投票
2 回答
3387 浏览

c++ - 具有非 size_t 整数的 std::array 的 C++ 模板参数推导

我正在尝试根据我的需要调整避免可变参数模板函数中的结构中提出的解决方案。但是,我无法理解 G++ 的行为。考虑以下函数:

然后打电话

与抱怨的 GCC 不匹配

但是,如果我更改unsigned Sizeunsigned long Sizeor ,它匹配size_t。我不确定这里发生了什么。Size调用中的参数不是std::array<T, Size>转换为 asize_t吗?

0 投票
2 回答
48 浏览

c++ - 类中的函数模板参数推导

我一直认为函数模板参数推导只适用于下面的纯函数,而不适用于类。

今天只是偶然我把这样的功能放在一个类中,它确实像下面这样工作。

我在 Linux 中使用 g++ 4.4。这应该失败还是我误解了?

0 投票
1 回答
767 浏览

c++ - 从指向基类成员的指针的模板推导

我无法弄清楚我做错了什么。从指针到基类成员的模板推导中的问题 - &DerivedClass::BaseClassMemeber。

完整示例:

我可以找到几种解决方法,例如附加测试函数重载与一个模板参数、static_cast、隐式偏特化(测试)。

但我对编译器无法使用 &DerivedClass::BaseClassMemeber 中明确指定的类的原因感兴趣。就是那个问题。如果您有更优雅的问题解决方案,欢迎。

0 投票
1 回答
137 浏览

c++ - 不可行函数模板的类型推导

这个问题和评论部分的回答中,Johannes Schaub说在尝试对需要比传递的参数更多的函数模板进行模板类型推导时出现“匹配错误”:

在另一个问题的上下文中,相关的是函数模板的类型推导是否成功(并且发生替换):

在为 实例化第一个函数模板fooT == int,替换会产生一个不在 的直接上下文中的无效类型foo。这会导致一个硬错误(这就是相关问题的内容。)

然而,当foo推导出它的模板参数时,g++ 和 clang++ 同意没有实例化发生。正如Johannes Schaub 解释的那样,这是因为存在“匹配错误”。

问题:什么是“匹配错误”,标准中在何处以及如何指定?

foo(42)替代问题:为什么 g++和foo<int>(42)for g++之间有区别?


到目前为止我发现/尝试的内容:

[over.match.funcs]/7 和 [temp.over] 似乎描述了函数模板的重载解析细节。后者似乎要求将模板参数替换为foo.

有趣的是,[over.match.funcs]/7在检查函数模板的可行性(专业化)之前触发了 [temp.over] 中描述的过程。类似地,类型推导不考虑默认函数参数(除了使它们成为非推导上下文)。据我所知,它似乎不关心可行性。

另一个可能重要的方面是如何指定类型推导。它作用于单个函数参数,但我看不出包含 / 的参数类型取决于模板参数(如T const&)和不依赖于模板参数的参数类型(如 )之间的区别int

然而,g++ 在显式指定模板参数(硬错误)和让它们被推断(推断失败/SFINAE)之间有所不同。为什么?

0 投票
1 回答
411 浏览

c++ - 使用元组的 lambda 模板参数推导失败

我正在尝试创建一个查询函数,让我查询 STL 容器的某些元素特征,然后返回结果集。它实际上只是围绕正常 STL 操作(特别是 copy_if 和 back_inserter)的语法糖。

这是编译器输出(Clang 3.3)