为什么模板参数推导失败?
Why template argument deduction fails?
最小化示例:
template <typename T, int N>
struct Deducer {
Deducer(int) {}
};
template <typename T, int N = 1>
void foo(Deducer<T, N> d){}
int main() {
foo<char>(345);
}
神博尔特示例
产量误差
candidate template ignored: could not match 'Deducer<char, N>' against 'int'
为什么编译器忽略隐式强制转换?
如果这里有任何简单的解决方法?
我可以考虑两个选项:
(1(指定所有模板参数(对我来说不是选项,实际案例有很多,我要扣除( (2(像这样编写中间函数:
template <typename T, int N = 1>
void foo_step(int d){ foo<T, N>(d); }
也不是一个选择,我有很多论点。
有什么想法吗?
N
可推导
template <typename T, int N = 1> void foo(Deducer<T, N> d)
因此,默认值= 1
大多是无用的。
如果要强制调用该方法,例如:
foo<char>(345);
foo<char, 42>(345);
您可能会执行以下操作:
// in C++20, std::type_identity might be used instead:
template <typename T> struct non_deducible { using type = T; };
template <typename T> using non_deducible_t = typename non_deducible<T>::type;
template <typename T, int N = 1> void foo(non_deducible_t<Deducer<T, N>> d);
但是你再也做不到了:
foo(Deducer<char, 42>());
根据这个:
类型推断不考虑隐式转换(上面列出的类型调整除外(:这是重载解决的工作,稍后会发生。
你可以尝试这样的东西:
template <typename T, typename U, int N = 1>
void foo(U&& u)
{
foo(Deducer<T,N>(std::forward<U>(u)));
}
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- variadic模板中的模板参数推导失败
- 当给定默认值时,为什么此模板参数推导失败
- 模板参数推导失败,函数参数/参数不匹配
- 为什么模板参数推导失败?
- 嵌套参数包扩展失败
- 模板参数的 C++ 自动模板推导失败
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 失败,出现错误 87:参数不正确.如何判断哪个参数不正确?
- 在 g++ 6.2.1 中将参数包转发到 constructor() 失败
- 当变量和参数名称匹配时,移动语义构造失败
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 模板参数推导/替换失败,lambda作为函数指针
- 调用基函数时模板参数推导失败
- 类模板参数推导失败会导致替换失败
- 折叠表达式模板参数推导/替换失败
- 结果失败或多个参数无效