这个类模板语法,顿时凌乱了

Jenf_Mu 2012-12-15 10:51:37
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

template <typename elementType>
struct DisplayElement
{
int a;
DisplayElement(int _a):a(_a)
{

}
void operator () (const elementType& element) const
{
cout << a<<":"<<element << endl;
}
};


int main(int argc, char *argv[])
{
vector<int> vecIntegers;
vecIntegers.resize(10);

for_each ( vecIntegers.begin () // Start of range
, vecIntegers.end () // End of range
, DisplayElement <int>(9) ); // Unary function object

return 0;
}


关键是DisplayElement <int>(9)这里,首先说一点,在VS2008里的运行结果是
-2:0
-2:0
-2:0……
在VS2010里的运行结果是
9:0
9:0
9:0
这可能跟C++11标准有关。因为VS2010是支持C++11标准的。

此例的本意是想调用operator ()这个函数。但它又不是一个静态函数,我想知道,如果这个函数需要操作对象的成员变量,会有什么结果。如果这里用DisplayElement <int>(),会提示没有对应的构造函数,我试了几种写法,都报错,只有这种写法不报错,但我实在想不通它的含义是什么

参数我的另一个问题

http://bbs.csdn.net/topics/390317131
...全文
214 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
redleaves 2012-12-15
  • 打赏
  • 举报
回复
引用 10 楼 akirya 的回复:
试了VC6 VC7 VC7.1 VC8 VC9 VC10 VC11 输出的结果都一致。 lz咋弄的?
我很好奇,你用这么多版本的编译器是怎么管理的? 我也收藏了VC6除外的几乎所有Win32平台的编译器,现在我是用批处理写了个CC,统一了各种编译器的参数,配置调用等等...不知道你怎么搞的?
  • 打赏
  • 举报
回复
试了VC6 VC7 VC7.1 VC8 VC9 VC10 VC11 输出的结果都一致。 lz咋弄的?
lee_鹿游原 2012-12-15
  • 打赏
  • 举报
回复
引用 8 楼 redleaves 的回复:
你的2008结果不对,我这却是对的...难道你没安SP1?
同上, 08对的
redleaves 2012-12-15
  • 打赏
  • 举报
回复
你的2008结果不对,我这却是对的...难道你没安SP1?
oniisama 2012-12-15
  • 打赏
  • 举报
回复
这个语法就是调用DisplayElement(int _a)这个构造函数来构造一个临时对象传给for_each
Jenf_Mu 2012-12-15
  • 打赏
  • 举报
回复
引用 3 楼 lile1234_show 的回复:
C/C++ code?1234567891011121314class A{ void op const { std::cout<<"L"<<std::endl; }}int main{ vector<A>a; A p; a.pushback(p); for_each(a.begin(),a.end(),mem_fun_ref(&A::op));} ……
而且你也没有试A类如果只有一个构造函数,而它的构造函数需要有参数的情况,怎么写
Jenf_Mu 2012-12-15
  • 打赏
  • 举报
回复
引用 3 楼 lile1234_show 的回复:
C/C++ code?1234567891011121314class A{ void op const { std::cout<<"L"<<std::endl; }}int main{ vector<A>a; A p; a.pushback(p); for_each(a.begin(),a.end(),mem_fun_ref(&A::op));} ……
而且你这个例子op函数没有调用A类的成员变量,如果调用了,mem_fun这里会报错
Jenf_Mu 2012-12-15
  • 打赏
  • 举报
回复
引用 3 楼 lile1234_show 的回复:
C/C++ code?1234567891011121314class A{ void op const { std::cout<<"L"<<std::endl; }}int main{ vector<A>a; A p; a.pushback(p); for_each(a.begin(),a.end(),mem_fun_ref(&A::op));} ……
我知道用mem_fun,而DisplayElement <int>(9)这样写的语法,是国外一本教材里(包含C++11标准)里这么写的,我就想知道这样的写法的含义是什么
lee_鹿游原 2012-12-15
  • 打赏
  • 举报
回复

class A
{
  void op const
  {
   std::cout<<"L"<<std::endl;
  }
}
int main
{
 vector<A>a;
 A p;
 a.pushback(p);
 for_each(a.begin(),a.end(),mem_fun_ref(&A::op));
}

lee_鹿游原 2012-12-15
  • 打赏
  • 举报
回复
http://blog.csdn.net/yingevil/article/details/6745793 给你个帖子看。
IranCyberArmy 2012-12-15
  • 打赏
  • 举报
回复
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

template <typename elementType>
struct DisplayElement
{
	int a;
	DisplayElement(int _a):a(_a)
	{
		cout<<"constructor"<<_a<<a<<endl;
	}
	void operator () (const elementType& element) const
	{
		cout << a<<":"<<element << endl;
	}
};

int main(int argc, char *argv[])
{
	vector<int> vecIntegers;
	vecIntegers.resize(10);

	for_each ( vecIntegers.begin ()    // Start of range
		, vecIntegers.end ()        // End of range
		, DisplayElement <int>(123) ); // Unary function object

	return 0;
}
在VS2008和GCC里,cout<<"constructor"<<_a<<a<<endl;这句,竟然_a和a的不一样。 这种变态的语法,说小点,是编译器的bug,说大点,是C++标准的bug,楼主不必纠结了
zhangwuji156 2012-12-15
  • 打赏
  • 举报
回复
这个是,函数对象
  • 打赏
  • 举报
回复
引用 11 楼 redleaves 的回复:
引用 10 楼 akirya 的回复:试了VC6 VC7 VC7.1 VC8 VC9 VC10 VC11 输出的结果都一致。 lz咋弄的?我很好奇,你用这么多版本的编译器是怎么管理的? 我也收藏了VC6除外的几乎所有Win32平台的编译器,现在我是用批处理写了个CC,统一了各种编译器的参数,配置调用等等...不知道你怎么搞的?
提取编译器,基本上直接拷贝bin include lib目录,删掉不必要的东西,不删也无所谓。 弄个批处理编译然后在 scite(自己改的)或 Editplus 中配置好,直接调用批处理编译。 这两个好处就是有菜单可以选择不同的配置。

65,186

社区成员

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

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