gpt4 book ai didi

c++ - upper_bound 与 binary_function Visual Studio 2008 Bug?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:44:19 26 4
gpt4 key购买 nike

1st 是的,我一直在使用 Visual Studio 2008,我相信这个错误是 Visual Studio 2008 特有的。

我正在尝试编写一个仿函数来比较我的结构中的 1 个成员,这样我就可以在由该成员排序的所述结构的 vector 上执行 upper_bound .这很难用语言解释,所以这里有一个例子:

struct Foo {
int a;
char b;
};

struct comp : binary_function<const double, const Foo&, bool> {
bool operator () (const double lhs, const Foo& rhs) { return lhs < rhs.a; }
};

int main() {
vector<Foo> test;

for(int i = 0; i < 5; ++i) {
Foo foo = { i + 1, 'a' + i };

test.push_back(foo);
}

cout << upper_bound(test.begin(), test.end(), 2, comp())->b << endl;
}

这在 Visual Studio 2015 上运行良好.但是 Visual Studio 2008 给我错误:

error C2664: 'bool comp::operator ()(const double,const Foo &)' : cannot convert parameter 1 from 'Foo' to 'const double'

我怀疑在通过交换输入来测试仿函数的严格弱排序的实现中存在一些问题。有没有一种解决方法可以暂停对编译器的检查,或者我只需要更改我的仿函数以接收 2 个 Foo 并创建一个临时的 Foo 来表示2 在吗?

最佳答案

作为stated by Algirdas Preidžius这是 Visual Studio 2008 中的仅调试实现错误。已在 上更正.

该错误存在于 Microsoft 的 C++ 实现代码中,由 _HAS_ITERATOR_DEBUGGING 控制因此,如果禁用它是一个选项,请考虑将“_HAS_ITERATOR_DEBUGGING=0”添加到您的“预处理器定义”。

如果您不喜欢禁用迭代器检查的想法,您需要通过禁用 _HAS_ITERATOR_DEBUGGING 来解决问题,这样您的代码将类似于:

struct Foo {
int a;
char b;
};

int main() {
vector<Foo> test;

for(int i = 0; i < 5; ++i) {
Foo foo = { i + 1, 'a' + i };

test.push_back(foo);
}

#if _HAS_ITERATOR_DEBUGGING
for(vector<Foo>::const_iterator it = test.begin(); it != test.end(); ++it) {
if(it->a > 2) {
cout << it->b << endl;
break;
}
}
#else
struct comp : public binary_function<const double, const Foo&, bool> {
bool operator () (const double lhs, const Foo& rhs) { return lhs < rhs.a; }
};

cout << upper_bound(test.begin(), test.end(), 2, comp())->b << endl;
#endif
}

这里有几点说明:

  1. 请注意,我使用的是 #if,这意味着 if block 只会在 _HAS_ITERATOR_DEBUGGING 已定义且未定义时执行0。在设计时 Visual Studio 2008 似乎总是认为它是未定义的
  2. 如果您的特定情况需要在多个地方使用 comp,我的代码会内联定义 comp 1st 考虑包装整个 else-block 在函数中限制 #define 的数量,如果您使用 comp,显然此注释的适用性将受到限制> 在多种标准算法中

关于c++ - upper_bound 与 binary_function Visual Studio 2008 Bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42299656/

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