stl中的函数对象只能是临时对象吗?菜鸟提问

时间:2022-09-30 23:10:54
#include <iostream>
#include <functional>
using std::cout;
using std::endl;
/*
binary_function
*/
template<typename Arg1,typename Arg2,typename Ret>
class binary_function{
public:
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Ret return_type;
};
/*
pointer_to_binary_function
*/
template<typename Arg1,typename Arg2,typename Ret>
class pointer_to_binary_function:public binary_function<Arg1,Arg2,Ret>{
private:
Ret (*pmf)(Arg1,Arg2);
public:
explicit pointer_to_binary_function(Ret (*pmf_)(Arg1,Arg2))
:pmf(pmf_){
}
Ret operator()(Arg1 left,Arg2 right){
return pmf(Arg1,Arg2);
}
};
/*
ptr_fun
*/
template<typename Arg1,typename Arg2,typename Ret>
pointer_to_binary_function<Arg1,Arg2,Ret> ptr_fun(Ret (*pf)(Arg1,Arg2)){
return pointer_to_binary_function<Arg1,Arg2,Ret>(pf);
}
/*
test_function
*/
void test_function(int a,int b){
cout<<"Arg1 is "<<a<<endl;
cout<<"Arg2 is "<<b<<endl;
}
/*
main
*/
int main(int argc,char* argv[]){
int a=3;
int b=30;
pointer_to_binary_function<int,int,void>(test_function)(a,b);
return 0;
}

编译器为什么提示指针重定义呢?

26 个解决方案

#1


其实没多少代码的,只有main函数中的一句话,其他的都是stl的代码啊

#2


问题就在你的模板代码上。。。

#3


哪里啊?楼上大哥明示。。。
那个functional文件是没用的,刚才贴代码忘了删除了

#4


上错误提示,看看。

#5


binary_function最好改个名字
详细的错误信息是什么

#6


return pmf(Arg1,Arg2);
这句有问题吗?

#7


楼主,自己比较你哪里和我写的不一样。。。


// Test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#include <functional>
using std::cout;
using std::endl;
/*
    binary_function
*/
template<typename Arg1,typename Arg2,typename Ret>
class binary_function{
public:
    typedef Arg1 first_argument_type;
    typedef Arg2 second_argument_type;
    typedef Ret return_type;
};
/*
    pointer_to_binary_function
*/
template<typename Arg1,typename Arg2,typename Ret>
class pointer_to_binary_function : public binary_function<Arg1,Arg2,Ret>{
private:
    Ret (*pmf)(Arg1,Arg2);
public:
    explicit pointer_to_binary_function(Ret (*pmf_)(Arg1,Arg2))
        :pmf(pmf_){
    }
    Ret operator()(Arg1 left, Arg2 right){
        return (*pmf)(left, right);
    }
};
/*
    ptr_fun
*/
template<typename Arg1,typename Arg2,typename Ret>
pointer_to_binary_function<Arg1,Arg2,Ret> ptr_fun(Ret (*pf)(Arg1,Arg2)){
    return pointer_to_binary_function<Arg1,Arg2,Ret>(pf);
}
/*
    test_function
*/
void test_function(int a,int b){
    cout<<"Arg1 is "<<a<<endl;
    cout<<"Arg2 is "<<b<<endl;
}
/*
    main
*/
int main(int argc,char* argv[]){
    int a=3;
    int b=30;
    ptr_fun<int,int,void>(test_function)(a,b);
    return 0;
}

#8


2L大哥说的那个重载()的问题,我发现了,已经改正,但是此程序仍然不能运行,但是ptr_fun倒是可以运行

#9



#include <iostream>
#include <functional>
using std::cout;
using std::endl;
/*
    binary_function
*/
template<typename Arg1,typename Arg2,typename Ret>
class binary_function{
public:
    typedef Arg1 first_argument_type;
    typedef Arg2 second_argument_type;
    typedef Ret return_type;
};
/*
    pointer_to_binary_function
*/
template<typename Arg1,typename Arg2,typename Ret>
class pointer_to_binary_function:public binary_function<Arg1,Arg2,Ret>{
private:
    Ret (*pmf)(Arg1,Arg2);
public:
    explicit pointer_to_binary_function(Ret (*pmf_)(Arg1,Arg2))
        :pmf(pmf_){
    }
    Ret operator()(Arg1 left,Arg2 right){
        return pmf(Arg1,Arg2);
    }
};
/*
    ptr_fun
*/
template<typename Arg1,typename Arg2,typename Ret>
pointer_to_binary_function<Arg1,Arg2,Ret> ptr_fun(Ret (*pf)(Arg1,Arg2)){
    return pointer_to_binary_function<Arg1,Arg2,Ret>(pf);
}
/*
    test_function
*/
void test_function(int a,int b){
    cout<<"Arg1 is "<<a<<endl;
    cout<<"Arg2 is "<<b<<endl;
}
/*
    main
*/
int main(int argc,char* argv[]){
    int a=3;
    int b=30;
    pointer_to_binary_function<int,int,void>(test_function)(a,b);
    return 0;
}


重名了。

#10


error C2512: “pointer_to_binary_function<Arg1,Arg2,Ret>”: 没有合适的默认构造函数可用
1>        with
1>        [
1>            Arg1=int,
1>            Arg2=int,
1>            Ret=void
1>        ]
提示错误

#11


Ret operator()(Arg1 left, Arg2 right){
    return (*pmf)(left, right);
}
(pointer_to_binary_function<int,int,void>(test_function))(a,b);//这里不明白编译器怎么解释
我的错误提示完全不同

#12



std::pointer_to_binary_function<int,int,void>(test_function)(a,b);

即使这样的代码也是有错误的,我用stl定义的函数,vs环境下

#13



pointer_to_binary_function<Arg1,Arg2,Ret> //函数返回值
ptr_fun //函数名
(Ret (*pf)(Arg1,Arg2)) //函数参数
{  //函数体
    return pointer_to_binary_function<Arg1,Arg2,Ret>(pf);
}


pointer_to_binary_function<int,int,void>(test_function)(a,b);
这句的错误明白了吗?

return pmf(
Arg1 ,//类型,不是形参
Arg2 //类型,不是形参
);
改成return pmf(left, right);

#14


好家伙,一上来就stl adapter的代码啊。
貌似这样进度,你的基础还不够。

#15


引用 13 楼 freezezdj 的回复:
C/C++ code
pointer_to_binary_function<Arg1,Arg2,Ret>//函数返回值ptr_fun//函数名(Ret (*pf)(Arg1,Arg2))//函数参数{//函数体return pointer_to_binary_function<Arg1,Arg2,Ret>(pf);
}

pointer_to_binary_function <int,int,void>(test_function)(a,b);
这句的错误明白了吗?

return pmf(
Arg1 ,//类型,不是形参
Arg2 //类型,不是形参
);
改成return pmf(left, right);

改了也不对

#16


引用 14 楼 taodm 的回复:
好家伙,一上来就stl adapter的代码啊。
貌似这样进度,你的基础还不够。


呵呵,这位大哥能给提示下是什么错误吗?

主要是那个ptr_fun调用是可以出结果的,但是pointer_to_binary_function是错误的

#17


太长,太复杂,不看。
现在只会用boost::lambda了,免复杂的adapter。

#18


11L加个括号还不行?
(pointer_to_binary_function <int,int,void>(test_function))(a,b)

#19


楼上大哥,这个很神奇,行了。。。。看来还是基础不扎实。。。。泪流满面

#20


是啊,为什么加个括号就行了呢?我也不懂啊。。。

#21


该回复于2010-01-29 11:45:35被版主删除

#22


引用 18 楼 hai040 的回复:
11L加个括号还不行?
(pointer_to_binary_function <int,int,void>(test_function))(a,b)


加个括号应该是限定它调用了:
explicit pointer_to_binary_function(Ret (*pmf_)(Arg1,Arg2))
        :pmf(pmf_){
    }
这个构造函数,而不是用ptr_fun模板函数了。

#23


引用 22 楼 freezezdj 的回复:
引用 18 楼 hai040 的回复:
 11L加个括号还不行?
 (pointer_to_binary_function  <int,int,void>(test_function))(a,b)


 加个括号应该是限定它调用了:
 explicit pointer_to_binary_function(Ret (*pmf_)(Arg1,Arg2))
         :pmf(pmf_){
     }
 这个构造函数,而不是用ptr_fun模板函数了。

好像不是这样的,你把ptr_fun去掉,也是一样的错误。。。

#24


引用 20 楼 healer_kx 的回复:
是啊,为什么加个括号就行了呢?我也不懂啊。。。

编译器解析问题,解析成函数声明了。

#25


引用 24 楼 akirya 的回复:
引用 20 楼 healer_kx 的回复:
 是啊,为什么加个括号就行了呢?我也不懂啊。。。

 编译器解析问题,解析成函数声明了。


不是的。。我现在完全明白了,是解析成普通变量定义了。(我很确定)

#26


哈哈,确实,非常有趣。
多余的()可以忽略问题,函数、变量、。。。解析优先顺序问题。

#1


其实没多少代码的,只有main函数中的一句话,其他的都是stl的代码啊

#2


问题就在你的模板代码上。。。

#3


哪里啊?楼上大哥明示。。。
那个functional文件是没用的,刚才贴代码忘了删除了

#4


上错误提示,看看。

#5


binary_function最好改个名字
详细的错误信息是什么

#6


return pmf(Arg1,Arg2);
这句有问题吗?

#7


楼主,自己比较你哪里和我写的不一样。。。


// Test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#include <functional>
using std::cout;
using std::endl;
/*
    binary_function
*/
template<typename Arg1,typename Arg2,typename Ret>
class binary_function{
public:
    typedef Arg1 first_argument_type;
    typedef Arg2 second_argument_type;
    typedef Ret return_type;
};
/*
    pointer_to_binary_function
*/
template<typename Arg1,typename Arg2,typename Ret>
class pointer_to_binary_function : public binary_function<Arg1,Arg2,Ret>{
private:
    Ret (*pmf)(Arg1,Arg2);
public:
    explicit pointer_to_binary_function(Ret (*pmf_)(Arg1,Arg2))
        :pmf(pmf_){
    }
    Ret operator()(Arg1 left, Arg2 right){
        return (*pmf)(left, right);
    }
};
/*
    ptr_fun
*/
template<typename Arg1,typename Arg2,typename Ret>
pointer_to_binary_function<Arg1,Arg2,Ret> ptr_fun(Ret (*pf)(Arg1,Arg2)){
    return pointer_to_binary_function<Arg1,Arg2,Ret>(pf);
}
/*
    test_function
*/
void test_function(int a,int b){
    cout<<"Arg1 is "<<a<<endl;
    cout<<"Arg2 is "<<b<<endl;
}
/*
    main
*/
int main(int argc,char* argv[]){
    int a=3;
    int b=30;
    ptr_fun<int,int,void>(test_function)(a,b);
    return 0;
}

#8


2L大哥说的那个重载()的问题,我发现了,已经改正,但是此程序仍然不能运行,但是ptr_fun倒是可以运行

#9



#include <iostream>
#include <functional>
using std::cout;
using std::endl;
/*
    binary_function
*/
template<typename Arg1,typename Arg2,typename Ret>
class binary_function{
public:
    typedef Arg1 first_argument_type;
    typedef Arg2 second_argument_type;
    typedef Ret return_type;
};
/*
    pointer_to_binary_function
*/
template<typename Arg1,typename Arg2,typename Ret>
class pointer_to_binary_function:public binary_function<Arg1,Arg2,Ret>{
private:
    Ret (*pmf)(Arg1,Arg2);
public:
    explicit pointer_to_binary_function(Ret (*pmf_)(Arg1,Arg2))
        :pmf(pmf_){
    }
    Ret operator()(Arg1 left,Arg2 right){
        return pmf(Arg1,Arg2);
    }
};
/*
    ptr_fun
*/
template<typename Arg1,typename Arg2,typename Ret>
pointer_to_binary_function<Arg1,Arg2,Ret> ptr_fun(Ret (*pf)(Arg1,Arg2)){
    return pointer_to_binary_function<Arg1,Arg2,Ret>(pf);
}
/*
    test_function
*/
void test_function(int a,int b){
    cout<<"Arg1 is "<<a<<endl;
    cout<<"Arg2 is "<<b<<endl;
}
/*
    main
*/
int main(int argc,char* argv[]){
    int a=3;
    int b=30;
    pointer_to_binary_function<int,int,void>(test_function)(a,b);
    return 0;
}


重名了。

#10


error C2512: “pointer_to_binary_function<Arg1,Arg2,Ret>”: 没有合适的默认构造函数可用
1>        with
1>        [
1>            Arg1=int,
1>            Arg2=int,
1>            Ret=void
1>        ]
提示错误

#11


Ret operator()(Arg1 left, Arg2 right){
    return (*pmf)(left, right);
}
(pointer_to_binary_function<int,int,void>(test_function))(a,b);//这里不明白编译器怎么解释
我的错误提示完全不同

#12



std::pointer_to_binary_function<int,int,void>(test_function)(a,b);

即使这样的代码也是有错误的,我用stl定义的函数,vs环境下

#13



pointer_to_binary_function<Arg1,Arg2,Ret> //函数返回值
ptr_fun //函数名
(Ret (*pf)(Arg1,Arg2)) //函数参数
{  //函数体
    return pointer_to_binary_function<Arg1,Arg2,Ret>(pf);
}


pointer_to_binary_function<int,int,void>(test_function)(a,b);
这句的错误明白了吗?

return pmf(
Arg1 ,//类型,不是形参
Arg2 //类型,不是形参
);
改成return pmf(left, right);

#14


好家伙,一上来就stl adapter的代码啊。
貌似这样进度,你的基础还不够。

#15


引用 13 楼 freezezdj 的回复:
C/C++ code
pointer_to_binary_function<Arg1,Arg2,Ret>//函数返回值ptr_fun//函数名(Ret (*pf)(Arg1,Arg2))//函数参数{//函数体return pointer_to_binary_function<Arg1,Arg2,Ret>(pf);
}

pointer_to_binary_function <int,int,void>(test_function)(a,b);
这句的错误明白了吗?

return pmf(
Arg1 ,//类型,不是形参
Arg2 //类型,不是形参
);
改成return pmf(left, right);

改了也不对

#16


引用 14 楼 taodm 的回复:
好家伙,一上来就stl adapter的代码啊。
貌似这样进度,你的基础还不够。


呵呵,这位大哥能给提示下是什么错误吗?

主要是那个ptr_fun调用是可以出结果的,但是pointer_to_binary_function是错误的

#17


太长,太复杂,不看。
现在只会用boost::lambda了,免复杂的adapter。

#18


11L加个括号还不行?
(pointer_to_binary_function <int,int,void>(test_function))(a,b)

#19


楼上大哥,这个很神奇,行了。。。。看来还是基础不扎实。。。。泪流满面

#20


是啊,为什么加个括号就行了呢?我也不懂啊。。。

#21


该回复于2010-01-29 11:45:35被版主删除

#22


引用 18 楼 hai040 的回复:
11L加个括号还不行?
(pointer_to_binary_function <int,int,void>(test_function))(a,b)


加个括号应该是限定它调用了:
explicit pointer_to_binary_function(Ret (*pmf_)(Arg1,Arg2))
        :pmf(pmf_){
    }
这个构造函数,而不是用ptr_fun模板函数了。

#23


引用 22 楼 freezezdj 的回复:
引用 18 楼 hai040 的回复:
 11L加个括号还不行?
 (pointer_to_binary_function  <int,int,void>(test_function))(a,b)


 加个括号应该是限定它调用了:
 explicit pointer_to_binary_function(Ret (*pmf_)(Arg1,Arg2))
         :pmf(pmf_){
     }
 这个构造函数,而不是用ptr_fun模板函数了。

好像不是这样的,你把ptr_fun去掉,也是一样的错误。。。

#24


引用 20 楼 healer_kx 的回复:
是啊,为什么加个括号就行了呢?我也不懂啊。。。

编译器解析问题,解析成函数声明了。

#25


引用 24 楼 akirya 的回复:
引用 20 楼 healer_kx 的回复:
 是啊,为什么加个括号就行了呢?我也不懂啊。。。

 编译器解析问题,解析成函数声明了。


不是的。。我现在完全明白了,是解析成普通变量定义了。(我很确定)

#26


哈哈,确实,非常有趣。
多余的()可以忽略问题,函数、变量、。。。解析优先顺序问题。