【发布时间】:2019-05-30 17:12:13
【问题描述】:
为什么下面的编译失败?
inline Obj init_output_string() { return open_output_string(); }
template<typename... Args>
Obj init_output_string(Args... prev, int last)
{
Obj port(init_output_string(prev...));
write_char(port, last);
return port;
}
int ch1 = ...;
int ch2 = ...;
Obj port = init_output_string(ch1, ch2);
(对于 MSVC,错误为 'init_output_string': no overloaded function takes 2 arguments,g++ 给出了类似的错误)。
但以下变体确实可以编译
inline Obj init_output_string() { return open_output_string(); }
template<typename... Args>
Obj init_output_string(int first, Args... rest)
{
Obj port(init_output_string(rest...));
write_char(port, first);
return port;
}
int ch1 = ...;
int ch2 = ...;
Obj port = init_output_string(ch1, ch2);
区别在于字符的书写顺序。我可以很容易地解决这个问题,但我很想知道我的第一个示例违反了什么规则。
【问题讨论】: