为什么这个初始化列表不能匹配模板参数?
Why can't this initializer-list match to a template argument?
#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"}));
为什么初始化列表不能匹配模板构造函数?
{"foo", "bar", "baz"}
没有类型,因此无法推导出
template <typename Container>
Foo (const Container&);
您只能将其用于扣除
template <typename T>
Foo (const std::initializer_list<T>&);
正如 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 样式数组的初始化列表。
#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"}));
为什么初始化列表不能匹配模板构造函数?
{"foo", "bar", "baz"}
没有类型,因此无法推导出
template <typename Container>
Foo (const Container&);
您只能将其用于扣除
template <typename T>
Foo (const std::initializer_list<T>&);
正如 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 样式数组的初始化列表。