【发布时间】:2014-08-14 04:47:37
【问题描述】:
如果我尝试编译以下代码,我会收到以下编译器错误(请参阅代码。)如果删除了 std::endl,它编译不会出错。
#include <iostream>
#include <sstream>
#include <utility>
namespace detail
{
template <class T>
void print(std::ostream& stream, const T& item)
{
stream << item;
}
template <class Head, class... Tail>
void print(std::ostream& stream, const Head& head, Tail&&... tail)
{
detail::print(stream, head);
detail::print(stream, std::forward<Tail>(tail)...);
}
}
template <class... Args>
void print(std::ostream& stream, Args&&... args)
//note: candidate function not viable: requires 3 arguments, but 4 were provided
{
std::stringstream ss;
detail::print(ss, std::forward<Args>(args)...);
stream << ss.rdbuf();
}
int main()
{
print(std::cout, "The answer is ", 42, std::endl);
//error: no matching function for call to 'print'
}
【问题讨论】:
-
这并不神秘。这意味着没有
print的定义接受这些论点。我不确定print是从哪里来的。为什么不直接使用std::cout << "The answer is " << 42 << std::endl; -
您是在问“代码有什么问题?”还是“为什么错误信息不清楚?”
-
@sjeohp 你确定吗?这听起来很疯狂。
-
这是用于输出的标准 c++ 语法
-
std::endl是一个模板。
标签: c++ c++11 compiler-errors iostream variadic-templates