我正在使用clang编译一些代码(我用microsoft工具链编写和编译好的代码).这是一些我不理解错误的代码:
#include <iostream>
#include <bitset>
template <int N>
auto foo(int index, std::bitset<N> & already_given)->int
{
return 0;
}
auto bar()->void
{
auto const n = 10;
auto baz = std::bitset<n>{};
for (auto i = 0; i < n; i++) {
std::cout << foo(i, baz)
<< std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
给了我错误no matching function to call to 'foo'.这个错误的来源是什么?
std::bitset是一个类模板,将其参数作为std::size_t:
template< std::size_t N >
class bitset;
Run Code Online (Sandbox Code Playgroud)
在执行时auto baz = std::bitset<n>{};,n可以隐式转换为std::size_t,但在模板参数推断期间,类型必须完全匹配[temp.deduct.type]/p17:
如果在与非类型的函数模板的声明模板参数中,非类型模板参数是在功能参数列表,并且如果对应的表达式中使用的模板参数的推导,该模板-参数类型应与模板参数的类型完全匹配,除了从数组绑定推导出的模板参数可以是任何整数类型.
非类型模板参数int N从整数中推导出参数,该整数与bitset的类型不匹配,因此您有一个演绎失败.
要解决此问题,您需要更改参数以匹配类型:
template <std::size_t N>
auto foo(int index, std::bitset<N>& already_given) -> int;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
271 次 |
| 最近记录: |