std::cout<

miliggate 2013-07-08 06:55:25
如果在声明函数的参数时使用了一个类,那么在查找匹配的函数名字时,编译器会在包含参数类型的名字空间中也进行查找。
那么根据这个规则
std::cout<<endl;应该是成立的,
但是在vs2012上却会编译错误
需要使用
std::cout<<std::endl;
才能过编译
求解
...全文
742 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ken_scott 2013-07-09
  • 打赏
  • 举报
回复
我也来扯一句 endl是一个函数(其实是个函数模板),(以前以为是一个平台相关的字符(串)常量),大致"功能"实现: ostream & endl(ostream & os) { #if defined(WINDOWS) // 请不要纠结这个宏 os << "\r\n"; // Windows下 可能实现 #elif defined(MAC) // 请不要纠结这个宏 os << '\r'; // MacOS下 可能实现 #elif defined(LINUX) // 请不要纠结这个宏 os << '\n'; // Linux下 可能实现 #endif os.flush(); // 刷新一下os流对象 return(os); } 只是功能上大概是做了这么些东西,不一定啊....不负责..... cout前面要加std::的话,endl前面也要加的,除非使用了using修饰符或者using声明 using namespace std; using std::cout; using std::endl;
飞天御剑流 2013-07-08
  • 打赏
  • 举报
回复
endl的实现通常是一个类型为basic_ostream< charT, Traits>& (*)( basic_ostream< charT, Traits > )的函数指针,basic_ostream< charT, Traits >定义了以上述函数指针为形参的operator<<成员函数(共预定义了四种函数指针类型),如下:

template< typename charT, typename Traits >
basic_ostream< charT, Traits>& endl( basic_ostream< charT, Traits > )
{
    ......
}

template< typename charT, typename Traits >
basic_ostream< charT, Traits >& basic_ostream< charT, Traits >::operator<<
( basic_ostream< charT, Traits>& ( *manip )( basic_ostream< charT, Traits > ) )
{
    return ( *manip )( *this );
}
所以endl前面必须要有std的。
飞天御剑流 2013-07-08
  • 打赏
  • 举报
回复
噢,不对,记错东西了,请无视2楼。
橡木疙瘩 2013-07-08
  • 打赏
  • 举报
回复
如果在声明函数的参数时使用了一个类,那么在查找匹配的函数名字时,编译器会在包含参数类型的名字空间中也进行查找。 可std::endl不是你调用的函数,而是函数的参数。operator<<才是你调用的函数。 你所说的其实是下面这段代码:

#include <iostream>
#include <string>

int main()
{
    std::string str;
    getline( std::cin, str);//不需要写std::getline
    return 0;
}
miliggate 2013-07-08
  • 打赏
  • 举报
回复
引用 2 楼 supermegaboy 的回复:
[quote=引用 楼主 SisMVG 的回复:] 如果在声明函数的参数时使用了一个类,那么在查找匹配的函数名字时,编译器会在包含参数类型的名字空间中也进行查找。 那么根据这个规则 std::cout<<endl;应该是成立的, 但是在vs2012上却会编译错误 需要使用 std::cout<<std::endl; 才能过编译 求解
endl是一个类,然后在此类中声明了operator<<友元,函数名称是operator<<,第一个实参使用了std,会使编译器除了查找全局域中的operator<<之外,还在std中查找operator<<,这才是ADL;但endl不过是operator<<的另一个实参,这与ADL就无关了。[/quote] 了解了。。
飞天御剑流 2013-07-08
  • 打赏
  • 举报
回复
引用 楼主 SisMVG 的回复:
如果在声明函数的参数时使用了一个类,那么在查找匹配的函数名字时,编译器会在包含参数类型的名字空间中也进行查找。 那么根据这个规则 std::cout<<endl;应该是成立的, 但是在vs2012上却会编译错误 需要使用 std::cout<<std::endl; 才能过编译 求解
endl是一个类,然后在此类中声明了operator<<友元,函数名称是operator<<,第一个实参使用了std,会使编译器除了查找全局域中的operator<<之外,还在std中查找operator<<,这才是ADL;但endl不过是operator<<的另一个实参,这与ADL就无关了。
miliggate 2013-07-08
  • 打赏
  • 举报
回复
而且在vs2008以前std::cout<<endl;也是可以使用 是不是被修改了还是我理解错。

64,665

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧