为什么此初始值设定项列表无法与模板参数匹配?

时间:2018-11-07 10:29:32

标签: c++ templates c++17 initializer-list template-deduction

#include <iostream>

class Foo
{
public:

    template <typename Container>
    Foo (const Container & args)
    {
        for (auto arg : args)
            std::cout << "ARG(" << arg << ")\n";
    }
};

int main ()
{
    Foo foo ({"foo", "bar", "baz"});
}

错误(使用g++ -std=c++17)是

error: no matching function for call to ‘Foo::Foo(<brace-enclosed initializer list>)’

这有效

Foo foo (std::vector<const char*> ({"foo", "bar", "baz"}));

为什么初始化列表与模板构造函数不匹配?

2 个答案:

答案 0 :(得分:4)

{"foo", "bar", "baz"}没有类型,因此无法推论

template <typename Container>
Foo (const Container&);

您只能将其用于扣除

template <typename T>
Foo (const std::initializer_list<T>&);

答案 1 :(得分:1)

如Jarod42所述,{"foo", "bar", "baz"}没有类型,因此无法推论template <typename Container> Foo (const Container&)

另一种可能的解决方案是

template <typename T, std::size_t N>
Foo (T const (& arr)[N])
{
    for (auto arg : arr)
        std::cout << "ARG(" << arg << ")\n";
}

因此,{"foo", "bar", "baz"}被推导为具有正确大小(3)的C样式数组的初始化列表。