问题标签 [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.
c++ - 为什么这个函数指针的可变参数模板参数推导失败?
在以下最小示例中,S::foo
有效,但S::bar
失败。
唯一的区别是参数包Ts
和Us
.
struct FPtr
并且S::lol
是我发现的最好的解决方法,但在实践中使用起来相当不舒服。
为什么参数推导bar
失败(特别是因为我已经明确指定了类型,所以根本不应该发生推论)?这是一个编译器错误(与clang++ 3.5
and一起出现g++ 4.9
),还是出于某种原因这是标准中的错误?
错误信息是:
注意:我已经在GCC和LLVM错误跟踪器上报告了这个错误。
c++ - 为什么编译器不能从函数参数中推断出我的模板值?
以下不会编译:
我得到的错误是:
- 'E m' 的声明:void foo(E m) {}:阴影模板参数 'E m'
- 错误:没有匹配函数调用“foo(E)”:foo(A);
- 候选者是:模板 void foo(E) : void foo(E m) {}
- 模板参数推导/替换失败:无法推导模板参数'm':foo(A);
我不明白这里到底出了什么问题。为什么编译器不能从函数参数中推断出模板参数?
我需要做什么才能完成这项工作?
c++ - 使用空参数包显式调用可变参数函数模板
考虑这个简单的(坏的)函数模板,这个网站上存在很多变体:
两次尝试调用它:
我不能打电话(a)
,因为 lambda 不是std::function<R(Args...)>
所以模板推导失败。直截了当。
然而,(b)
也失败了。我怀疑这是因为编译器无法确定我的意思是提供我只是提供的所有R
类型参数和原因- 所以它正在尝试(并且失败)推断Args...
初始调用失败的相同原因。
有没有办法明确指定我提供所有模板参数?澄清一下,我只对如何显式提供模板参数感兴趣,以便没有模板推导 - 我不是在寻找正确的编写方法call_with
或在使用 lambda 调用时使模板推导成功的方法。
c++ - 为什么模板参数推导不起作用?
下面的玩具程序将一种音乐类型转换为相应的颜色。它编译和执行得很好——转换COUNTRY
失败,正如预期的那样,conversion()
函数返回默认值,WHITE
. 但是,如果我删除模板参数,则<MUSIC, COLOR>
模板参数推导无法识别要使用的类型。我怎样才能得到扣除工作?
c++ - SFINAE 仅启用从派生类到基类的强制转换运算符
我有一个类模板CFoo<T>
。我想允许隐式转换到 的其他实例CFoo
,但仅适用于模板参数是T
.
我尝试使用 SFINAE,但我的任何尝试都不适用于我尝试过的任何编译器(VC 2012 或 gcc):
为什么在 SFINAE 中被注释掉的任何一个尝试都不在这里工作?在这两种情况下,我都会收到一个无效初始化的错误a
,就好像我的操作员没有被调用一样。
c++11 - init-list-as-function-argument 和模板的重载解析语义错误
我已经为 C++11 在其持续构建过程中的使用配置了 Eclipse CDT(Eclipse v4.5.0,构建 ID 20150621-1200;CDT v8.7.0.201506070905),但某些表达式仍然会导致语义错误,即使它们编译正确使用 g++ 4.9.2 和 clang++ 3.8.0。也就是说,作为函数参数提供的大括号初始化列表与参数的相应std::initializer_list
构造函数不匹配,并且 LLVMcast
函数的正确版本也不与其提供的参数匹配。Eclipse CDT 是否使用不支持此类 C++11 功能的较旧的内部解析器,而不是委托给它检测到的更现代的外部 GCC 工具链?
错误 #1
无效参数 '
候选者是:
llvm::FunctionType * get(llvm::Type *, llvm::ArrayRef, bool)
llvm::FunctionType * get(llvm::Type *, bool)
错误 #2
无效参数 '
候选者是:
llvm::cast_retty<#0,#1 *>::ret_type cast(#1 *) std::enable_if::ret_type>::type cast(const #1 &)
llvm::cast_retty< #0,#1>::ret_type cast(#1 &)
'
c++ - 模板替换期间可能发生隐式转换?
我一直认为,使用模板化函数,不可能发生隐式转换,并且参数的类型必须与参数的模板化类型完全匹配,否则模板参数推导会失败。
嗯,看来我弄错了。
考虑以下代码段:
我不知道为什么第二个std::cout << (5 < j)
工作。这里肯定发生了隐式转换,我认为这是被禁止的。而且我更不确定为什么std::cout << (i < 6)
如果前一个可以工作,为什么不工作!
编辑:编译器错误std::cout << (i < 6)
:
c++ - 如何省略推导参数类型的完美转发?
假设我有一些函数是我想要推断的类型的参数类型(或几个参数类型)。此外,我想要基于事实的不同行为是右值还是左值。由于完美的转发,直截了当地写它会导致一个明显的(对于有经验的人)陷阱:
尽管这种行为的鬼鬼祟祟的性质已经是一个有趣的观点,但我的问题实际上是不同的——对于这种情况,什么是好的、简洁的、可理解的解决方法?
如果没有推断出完美转发的类型(例如,它已经知道外部类的模板参数或类似的东西),那么有一个众所周知的解决方法是使用typename identity<T>::type&&
代替,T&&
但是由于相同的构造是避免类型推断的解决方法,它在这种情况下没有帮助. 我可能可以想象一些 sfinae 技巧来解决它,但代码清晰度可能会被破坏,并且它看起来与类似的非模板函数完全不同。
c++ - decltype 在模板参数推导失败的情况下成功?
我想知道为什么当带有 bbb 的行没有被注释掉但它之前的行被注释掉时,下面的代码可以按预期编译和工作,但是当用 aaa 标记的行没有被注释掉并且 bbb 行时它确实会失败是: