gpt4 book ai didi

c++ - 使用 not2 时将 struct vs class 作为 STL 仿函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:50 24 4
gpt4 key购买 nike

学习STL 我写了一个简单的程序来测试仿函数和修饰符。我的问题是关于使用 CLASS 或 STRUCT 编写仿函数并尝试使用函数适配器对其进行操作的区别。据我在 C++ 中的理解,CLASS 和 STRUCT 之间的区别在于,在最后一种情况下,默认情况下成员是公共(public)的。这也是我在该站点的答案中多次阅读的内容。所以请解释为什么即使我在尝试使用 not2 修饰符时将所有成员(只是一个函数重载 () )声明为 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;
}

如果我使用,一切都会按预期运行:

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:
In instantiation of ‘std::binary_negate >’:
struct.cpp:52: instantiated from here
/usr/include/c++/4.2.1/bits/stl_function.h:116:
error: ‘typedef int std::binary_function::first_argument_type’ is inaccessible
/usr/include/c++/4.2.1/bits/stl_function.h:338:
error: within this context
/usr/include/c++/4.2.1/bits/stl_function.h:119:
error: ‘typedef int std::binary_function::second_argument_type’ is inaccessible ....

似乎至少在这种情况下,结构不等同于具有公共(public)成员的类,但为什么呢?

最佳答案

您从其他答案中读到的差异是正确的。 struct只是一个classpublic默认情况下的可访问性。这包括继承修饰符。基本上,你应该提到 public当您使用 class 时,在基类名称之前使这些定义等效:

template <class T>
class mystruct : public binary_function<T ,T ,bool> {
public:
bool operator() (T i,T j) const { return i<j; }
};

否则,编译器会假设mystruct正在私有(private)继承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 的定义并看到编译器发出类似的错误消息。

关于c++ - 使用 not2 时将 struct vs class 作为 STL 仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1870035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com