【发布时间】:2014-11-29 00:42:14
【问题描述】:
我有一个模板,如果我将一个 lambda 传递给它,它就可以工作,但是在一个相关模板中,它需要两个 lambdas 映射到同一个模板化类型,它无法推断出该类型,并且 MSVC++ Express 2013 抱怨模板参数不明确。需要明确的是,这里没有重载(或专业化)——我下面的两个示例是唯一具有这些标识符的实体。以下是模板,它们只是将可调用对象应用于参数并返回结果:
template <class A, class OP>
auto WhichOp1(A argument, OP firstOp)->decltype(firstOp(argument)) {
return firstOp(argument);
}
template <class A, class OP>
auto WhichOp2(A argument, OP firstOp, OP secondOp)->decltype(firstOp(argument)) {
return firstOp(argument) + secondOp(argument);
}
我可以像这样成功使用WhichOp1:
int e = WhichOp1(2, [](int i){return i * 2; });
但是对 WhichOp2 的类似调用不会编译:
int d = WhichOp2(2, [](int i){return i * 2; }, [](int i){return i * 3; });
我收到以下错误:
错误 C2782: 'unknown-type chaj::ops::WhichOp2(A,OP,OP)' : 模板参数 'OP' 不明确
IntelliSense:没有函数模板“chaj::ops::WhichOp2”的实例与参数列表匹配 参数类型有: (int, lambda []int (int i)->int, lambda []int (int i)->int)
我收集到的是,它根本无法将第一个 lambda 与第二个 lambda 并在两者之间确定 OP 的确切类型应该是什么。如果我显式实例化,则可以很好地解决歧义:
int b = WhichOp2<int, int(*)(int)>(2, [](int i){return i * 2; }, [](int i){return i * 3; });
所以我的问题只是试图更好地理解正在发生的事情——为什么编译器在将两个相似的 lambdas 传递给一个通用模板参数下的模板时不能解决歧义?智能感知错误似乎将 lambdas 的类型映射到相同的类型。如果这是特定于编译器的,我不会感到惊讶,但如果有人看到这适用于他们的编译器,我很想知道。
【问题讨论】:
标签: c++ templates lambda ambiguity