【发布时间】:2015-11-14 17:22:51
【问题描述】:
我正在使用 g++ 5.2。为什么会这样?
void func(std::vector<std::tuple<int>> v)
{
...
}
func({ std::make_tuple(1), std::make_tuple(2), std::make_tuple(3) });
但这不是吗?因为他们似乎在逻辑上等同于我。
template <typename... Args>
void func(std::vector<std::tuple<Args...>> v)
{
...
}
func({ std::make_tuple(1), std::make_tuple(2), std::make_tuple(3) });
它给出了错误:
error: could not convert ‘{std::make_tuple(_Elements&& ...) [with _Elements = {int}](), std::make_tuple(_Elements&& ...) [with _Elements = {int}](), std::make_tuple(_Elements&& ...) [with _Elements = {int}]()}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<std::tuple<>, std::allocator<std::tuple<> > >’
func({ std::make_tuple(1), std::make_tuple(2), std::make_tuple(3) });
^
【问题讨论】:
-
尝试在第二次调用中删除
{}。它在第一个 arg 中起作用,因为 std::vector 可以使用初始化列表进行初始化。 -
这将调用带有三个参数的函数,它不会编译,因为它需要一个参数。
-
func({ std::make_tuple(1), std::make_tuple(2), std::make_tuple(3) });问题是,您如何期望编译器知道初始化列表指定vector还是tuple? -
...或
Foo,或任何其他类型。
标签: c++ tuples variadic-templates template-meta-programming