#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文件是没用的,刚才贴代码忘了删除了
那个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> ]
提示错误
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);//这里不明白编译器怎么解释
我的错误提示完全不同
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
改了也不对
#16
呵呵,这位大哥能给提示下是什么错误吗?
主要是那个ptr_fun调用是可以出结果的,但是pointer_to_binary_function是错误的
#17
太长,太复杂,不看。
现在只会用boost::lambda了,免复杂的adapter。
现在只会用boost::lambda了,免复杂的adapter。
#18
11L加个括号还不行?
(pointer_to_binary_function <int,int,void>(test_function))(a,b)
(pointer_to_binary_function <int,int,void>(test_function))(a,b)
#19
楼上大哥,这个很神奇,行了。。。。看来还是基础不扎实。。。。泪流满面
#20
是啊,为什么加个括号就行了呢?我也不懂啊。。。
#21
#22
加个括号应该是限定它调用了:
explicit pointer_to_binary_function(Ret (*pmf_)(Arg1,Arg2))
:pmf(pmf_){
}
这个构造函数,而不是用ptr_fun模板函数了。
#23
好像不是这样的,你把ptr_fun去掉,也是一样的错误。。。
#24
编译器解析问题,解析成函数声明了。
#25
不是的。。我现在完全明白了,是解析成普通变量定义了。(我很确定)
#26
哈哈,确实,非常有趣。
多余的()可以忽略问题,函数、变量、。。。解析优先顺序问题。
多余的()可以忽略问题,函数、变量、。。。解析优先顺序问题。
#1
其实没多少代码的,只有main函数中的一句话,其他的都是stl的代码啊
#2
问题就在你的模板代码上。。。
#3
哪里啊?楼上大哥明示。。。
那个functional文件是没用的,刚才贴代码忘了删除了
那个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> ]
提示错误
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);//这里不明白编译器怎么解释
我的错误提示完全不同
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
改了也不对
#16
呵呵,这位大哥能给提示下是什么错误吗?
主要是那个ptr_fun调用是可以出结果的,但是pointer_to_binary_function是错误的
#17
太长,太复杂,不看。
现在只会用boost::lambda了,免复杂的adapter。
现在只会用boost::lambda了,免复杂的adapter。
#18
11L加个括号还不行?
(pointer_to_binary_function <int,int,void>(test_function))(a,b)
(pointer_to_binary_function <int,int,void>(test_function))(a,b)
#19
楼上大哥,这个很神奇,行了。。。。看来还是基础不扎实。。。。泪流满面
#20
是啊,为什么加个括号就行了呢?我也不懂啊。。。
#21
#22
加个括号应该是限定它调用了:
explicit pointer_to_binary_function(Ret (*pmf_)(Arg1,Arg2))
:pmf(pmf_){
}
这个构造函数,而不是用ptr_fun模板函数了。
#23
好像不是这样的,你把ptr_fun去掉,也是一样的错误。。。
#24
编译器解析问题,解析成函数声明了。
#25
不是的。。我现在完全明白了,是解析成普通变量定义了。(我很确定)
#26
哈哈,确实,非常有趣。
多余的()可以忽略问题,函数、变量、。。。解析优先顺序问题。
多余的()可以忽略问题,函数、变量、。。。解析优先顺序问题。