问题标签 [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 投票
1 回答
488 浏览

c++ - 为什么这个函数指针的可变参数模板参数推导失败?

在以下最小示例中,S::foo有效,但S::bar失败。

唯一的区别是参数包TsUs.

struct FPtr并且S::lol是我发现的最好的解决方法,但在实践中使用起来相当不舒服。

为什么参数推导bar失败(特别是因为我已经明确指定了类型,所以根本不应该发生推论)?这是一个编译器错误(与clang++ 3.5and一起出现g++ 4.9),还是出于某种原因这是标准中的错误?

错误信息是:

注意:我已经在GCCLLVM错误跟踪器上报告了这个错误。

0 投票
3 回答
695 浏览

c++ - 为什么编译器不能从函数参数中推断出我的模板值?

以下不会编译:

我得到的错误是:

  • 'E m' 的声明:void foo(E m) {}:阴影模板参数 'E m'
  • 错误:没有匹配函数调用“foo(E)”:foo(A);
  • 候选者是:模板 void foo(E) : void foo(E m) {}
  • 模板参数推导/替换失败:无法推导模板参数'm':foo(A);

我不明白这里到底出了什么问题。为什么编译器不能从函数参数中推断出模板参数?

我需要做什么才能完成这项工作?

0 投票
2 回答
947 浏览

c++ - 使用空参数包显式调用可变参数函数模板

考虑这个简单的(坏的)函数模板,这个网站上存在很多变体:

两次尝试调用它:

我不能打电话(a),因为 lambda 不是std::function<R(Args...)>所以模板推导失败。直截了当。

然而,(b)也失败了。我怀疑这是因为编译器无法确定我的意思是提供我只是提供的所有R类型参数和原因- 所以它正在尝试(并且失败)推断Args...初始调用失败的相同原因。

有没有办法明确指定我提供所有模板参数?澄清一下,我对如何显式提供模板参数感兴趣,以便没有模板推导 - 我不是在寻找正确的编写方法call_with或在使用 lambda 调用时使模板推导成功的方法。

0 投票
2 回答
132 浏览

c++ - 为什么模板参数推导不起作用?

下面的玩具程序将一种音乐类型转换为相应的颜色。它编译和执行得很好——转换COUNTRY失败,正如预期的那样,conversion()函数返回默认值,WHITE. 但是,如果我删除模板参数,则<MUSIC, COLOR>模板参数推导无法识别要使用的类型。我怎样才能得到扣除工作?

0 投票
1 回答
992 浏览

c++ - SFINAE 仅启用从派生类到基类的强制转换运算符

我有一个类模板CFoo<T>。我想允许隐式转换到 的其他实例CFoo,但仅适用于模板参数是T.

我尝试使用 SFINAE,但我的任何尝试都不适用于我尝试过的任何编译器(VC 2012 或 gcc):

为什么在 SFINAE 中被注释掉的任何一个尝试都不在这里工作?在这两种情况下,我都会收到一个无效初始化的错误a,就好像我的操作员没有被调用一样。

0 投票
4 回答
505 浏览

c++ - 别名模板中的模板参数推导 - 定义任何成员函数指针

回答问题时,我建议使用模板别名来定义成员函数的签名;也就是说,不仅仅是类型定义一个成员函数,而且能够分解出包含该方法的目标类:

尽管这似乎涵盖了问题的内容,但我尝试将其概括为任意函数参数:

它因参数推导问题而失败(基本上它假定一个空参数列表)。这是一个演示

为什么是这样?有没有办法让它工作?

0 投票
2 回答
120 浏览

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 &)
'

0 投票
1 回答
72 浏览

c++ - 模板替换期间可能发生隐式转换?

我一直认为,使用模板化函数,不可能发生隐式转换,并且参数的类型必须与参数的模板化类型完全匹配,否则模板参数推导会失败。

嗯,看来我弄错了。

考虑以下代码段:

我不知道为什么第二个std::cout << (5 < j)工作。这里肯定发生了隐式转换,我认为这是被禁止的。而且我更不确定为什么std::cout << (i < 6)如果前一个可以工作,为什么不工作!

编辑:编译器错误std::cout << (i < 6)

0 投票
3 回答
397 浏览

c++ - 如何省略推导参数类型的完美转发?

假设我有一些函数是我想要推断的类型的参数类型(或几个参数类型)。此外,我想要基于事实的不同行为是右值还是左值。由于完美的转发,直截了当地写它会导致一个明显的(对于有经验的人)陷阱:

尽管这种行为的鬼鬼祟祟的性质已经是一个有趣的观点,但我的问题实际上是不同的——对于这种情况,什么是好的、简洁的、可理解的解决方法?

如果没有推断出完美转发的类型(例如,它已经知道外部类的模板参数或类似的东西),那么有一个众所周知的解决方法是使用typename identity<T>::type&&代替,T&&但是由于相同的构造是避免类型推断的解决方法,它在这种情况下没有帮助. 我可能可以想象一些 sfinae 技巧来解决它,但代码清晰度可能会被破坏,并且它看起来与类似的非模板函数完全不同。

0 投票
1 回答
135 浏览

c++ - decltype 在模板参数推导失败的情况下成功?

我想知道为什么当带有 bbb 的行没有被注释掉但它之前的行被注释掉时,下面的代码可以按预期编译和工作,但是当用 aaa 标记的行没有被注释掉并且 bbb 行时它确实会失败是: