upper_bound带有binary_function Visual Studio 2008错误



1 st ,是的,我使用Visual Studio 2008被卡住了,我相信此错误是Visual Studio 2008。

我试图写一个函子以比较我的结构的1个成员,以便我可以在该成员排序的上述结构的upper_bound上进行CC_1。这很难用文字解释,因此这是一个例子:

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给了我错误:

错误c2664:'bool comp :: operator()(const double,const foo&amp;)':无法将参数1从'foo'转换为'const double'

我怀疑实施中存在一些邪恶,其中通过交换输入来测试函数严格的弱排序。是否有解决方法可以暂停检查编译器的检查,还是只需要更改我的函数才能吸收2 Foo s并制作一个临时的 Foo来代表2个?

如Algirdaspreidžius所述,这是Visual Studio 2008中唯一的调试实现错误。它已在Visual-Studio-2010上进行了纠正。

该错误在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且为non -0时才能执行。在设计时,Visual Studio 2008似乎总是认为它是不确定的
  2. 我的代码将comp内联定义如果您的特定情况需要comp到多个位置使用1 st 请考虑将整个else -Block包装在函数中以限制代码中的#define s的数量,显然,如果您在多种标准算法中使用comp,则此评论的适用性将受到限制

正如Algirdaspreidžius所提到的那样,这是因为严格的较弱的顺序检查。

作为解决方法,您可以定义两个操作员。

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

相关内容

  • 没有找到相关文章

最新更新