按照定义 Args 应该是可以接受 0 个参数的,但是为什么如下的代码不能正确编译呢?( c++11)
#include <iostream>
#include <string>
template <typename T, typename... Args>
auto print(std::ostream& os, const T& t, const Args&... rest) -> decltype(os)
{
os << t;
if (sizeof...(Args) == 0)
return os << t;
else
return print(os, rest...);
}
int main()
{
print(std::cout, std::string("hepup"));
print(std::cout, 1, 2.23434);
print(std::cout, "hello", '\n', 3.134, true, 1e8);
return 0;
}
错误提示的是
recursive.cc:16:16: error: no matching function for call to 'print'
return print(os, rest...);
^~~~~
recursive.cc:21:5: note: in instantiation of function template specialization
'print<std::__1::basic_string<char>>' requested here
print(std::cout, std::string("hepup"));
^
recursive.cc:10:6: note: candidate function template not viable: requires at least 2
arguments, but 1 was provided
auto print(std::ostream& os, const T& t, const Args&... rest) -> decltype(os)
^
1 error generated.
诸如此类的。
按照标准A template parameter pack is a template parameter that accepts zero or more template arguments (non-types, types, or templates)
那么应该是可以接受 0 个参数,然后通过判断条件结束递归。可是为什么会编译出错呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.