C++ - 语句无法解析重载函数的地址
当我将以下内容作为独立行键入时:
std::endl;
我收到以下错误:
语句无法解析重载函数的地址
这是为什么?我不能将 std::endl;
写为独立行吗?
谢谢。
When I types the following as a stand-alone line:
std::endl;
I got the following error:
statement cannot resolve address for overloaded function
Why is that? Cannot I write std::endl;
as a stand-alone line?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
std::endl
是一个函数模板。通常,它用作插入运算符<<
的参数。在这种情况下,所讨论的流的运算符<<将被定义为例如ostream&。运算符<< (ostream&(*f)(ostream&))
。f
的参数类型已定义,因此编译器将知道该函数的确切重载。它与此类似:
但是您可以通过某些类型提示来解决歧义:
当将
std::endl
作为参数提供给operator <<
时,通常会发生这种情况:有一个函数的定义,这将使编译器在提供给例如
std::cout << 时选择正确的
。std::endl
重载。 std::endl;好问题!
std::endl
is a function template. Normally, it's used as an argument to the insertion operator<<
. In that case, theoperator<<
of the stream in question will be defined as e.g.ostream& operator<< ( ostream& (*f)( ostream& ) )
. The type of the argument off
is defined, so the compiler will then know the exact overload of the function.It's comparable to this:
But you can resolve the ambiguity by some type hints:
That's what happens normally with
std::endl
when supplied as an argument tooperator <<
: there is a definition of the functionAnd this will enable the compiler the choose the right overload of
std::endl
when supplied to e.g.std::cout << std::endl;
.Nice question!
我能想到的最可能原因是它的声明是:
换句话说,如果不成为
<<
操作的一部分,就没有os< /code> 可以推断。我很确定情况就是这样,因为该行:
编译得很好。
我向您提出的问题是:您为什么想要这样做?
我知道
7;
在 C 语言中是一个完全有效的语句,但你不会看到那种垃圾污染我的代码:-)The most likely reason I can think of is that it's declaration is:
In other words, without being part of a
<<
operation, there's noos
that can be inferred. I'm pretty certain this is the case since the line:compiles just fine.
My question to you is: why would you want to do this?
I know for a fact that
7;
is a perfectly valid statement in C but you don't see that kind of rubbish polluting my code :-)std::endl
是一个函数模板。如果您在无法唯一确定模板参数的上下文中使用它,则必须消除您所指的专业化的歧义。例如,您可以使用显式强制转换或将其分配给正确类型的变量。例如
,通常,您只需在自动推导模板参数的上下文中使用它。
std::endl
is a function template. If you use it in a context where the template argument cannot be uniquely determined you have to disambiguate which specialization you mean. For example you can use an explicit cast or assign it to a variable of the correct type.e.g.
Usually, you just use it in a context where the template argument is deduced automatically.
std::endl 是一个操纵器。它实际上是由 << 的 a 版本调用的函数。流上的运算符。
std::endl is a manipulator. It's actually a function that is called by the a version of the << operator on a stream.
http://www.cplusplus.com/reference/iostream/manipulators/endl/
您不能单独使用
std::endl
,因为它需要basic_ostream
作为参数类型。这就是它的定义方式。这就像当函数定义为
void my_func(int n)
时尝试调用my_func()
http://www.cplusplus.com/reference/iostream/manipulators/endl/
You can't have
std::endl
by itself because it requires abasic_ostream
as a type of parameter. It's the way it is defined.It's like trying to call
my_func()
when the function is defined asvoid my_func(int n)
endl 是一个带有参数的函数。请参阅 cplusplus.com 上的 std::endl
endl is a function that takes a parameter. See std::endl on cplusplus.com
std::endl
终止一行并刷新缓冲区。所以它应该像cout
或类似的那样连接流。The
std::endl
terminates a line and flushes the buffer. So it should be connected the stream likecout
or similar.