使用模板函数进行clang编译错误

moo*_*kid 1 c++ clang c++11

我正在使用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'.这个错误的来源是什么?

0x4*_*2D2 6

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)