当使用not2时,struct vs class为STL函数
学习STL我写了一个简单的程序来测试函数和修饰符。 我的问题是关于使用CLASS或STRUCT编写仿函数并试图用函数适配器对其进行操作的区别。 据我所知,在C ++中CLASS和STRUCT之间的区别在于,在最后一种情况下,成员默认是公开的。 这也是我在本网站的答案中多次阅读的内容。 因此,请解释为什么即使我尝试使用not2修饰符时声明所有成员(只是函数overloading())public,但这段代码仍然无法编译。 (我还没有尝试其他修饰符,如粘合剂呢)
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;
template <class T>
void print (T i) {
cout << " " << i;
}
// In the manual I read:
// "In C++, a structure is the same as a class except that its members are public by default."
// So if I declare all members public it should work....
template <class T>
class mystruct : binary_function<T ,T ,bool> {
public :
bool operator() (T i,T j) const { return i<j; }
};
template <class T>
class generatore
{
public:
generatore (T start = 0, T stp = 1) : current(start), step(stp)
{ }
T operator() () { return current+=step; }
private:
T current;
T step;
};
int main () {
vector<int> first(10);
generate(first.begin(), first.end(), generatore<int>(10,10) );
first.resize(first.size()*2);
generate(first.begin()+first.size()/2, first.end(), generatore<int>(1,17) );
cout << "nfirst :";
for_each (first.begin(), first.end(), print<int>);
cout << "nFORWARD SORT :";
sort(first.begin(),first.end(),mystruct<int>()); // OK ! even with CLASS
for_each (first.begin(), first.end(), print<int>);
sort(first.begin(),first.end(),not2(mystruct<int>())); // <--- THIS LINE WILL NOT COMPILE IF I USE CLASS INSTEAD OF STRUCT
cout << "nBACKWARD SORT :";
for_each (first.begin(), first.end(), print<int>);
cout << endl;
}
如果我使用以下Everithing预期运行:
struct mystruct : binary_function<T ,T ,bool> {
public :
bool operator() (T i,T j) const { return i<j; }
};
我获得的部分错误消息是:
g ++ struct.cpp
/usr/include/c++/4.2.1/bits/stl_function.h:
在“std :: binary_negate>”的实例化中:
struct.cpp:52:从这里实例化
/usr/include/c++/4.2.1/bits/stl_function.h:116:
错误:'typedef int std :: binary_function :: first_argument_type'无法访问
/usr/include/c++/4.2.1/bits/stl_function.h:338:
错误:在这种情况下
/usr/include/c++/4.2.1/bits/stl_function.h:119:
错误:'typedef int std :: binary_function :: second_argument_type'无法访问....
似乎至少在这种情况下,一个结构不等同于有公共成员的类,但为什么?
你从其他答案中读到的差异是正确的。 struct
只是一个默认具有public
可访问性的class
。 这包括继承修饰符。 基本上,当您使用class
来使这些定义等同时,您应该在基类名称之前提及public
:
template <class T>
class mystruct : public binary_function<T ,T ,bool> {
public:
bool operator() (T i,T j) const { return i<j; }
};
否则,编译器会认为mystruct
是私有继承binary_function<T,T,bool>
。
你可以通过改变struct
来验证这个事实:
struct mystruct : private binary_function<T ,T ,bool> {
public: // not required here
bool operator() (T i,T j) const { return i<j; }
};
这相当于您当前的class
定义,并看到编译器发出类似的错误消息。
在结构中,默认情况下继承是公共类,默认情况下它是私有的(如果你没有指定public / private / protected)
所以:
class mystruct : binary_function
手段
class mystruct : private binary_function
但
struct mystruct : binary_function
手段
struct mystruct : public binary_function
对于私有继承, mystruct
可以使用binary_function
所有公共mystruct
, mystruct
不能在mystruct
上调用binary_function
公共方法,而mystruct
不是binary_function
类型的(我相信)。
所以,当你通过mystruct
到binary_function
预计, mystruct
没有定义的东西,从预期binary_function
。
更具体地说,仿函数预计会有binary_function
提供的以下定义,所以当你从它继承时,你已经有了这些声明:
template <class _Arg1, class _Arg2, class _Result>
struct binary_function {
typedef _Arg1 first_argument_type; ///< the type of the first argument (no surprises here)
typedef _Arg2 second_argument_type; ///< the type of the second argument
typedef _Result result_type; ///< type of the return type
};
链接地址: http://www.djcxy.com/p/66733.html
上一篇: struct vs class as STL functor when using not2
下一篇: Properly detect appearance and disappearance of Keyboard