2

首先,是的,我被困在使用 Visual Studio 2008 中,我相信这个错误是 Visual Studio 2008 特有的。

我正在尝试编写一个仿函数来比较我的结构的一个成员,这样我就可以upper_boundvector按该成员排序的所述结构进行操作。这很难用语言来解释,所以这里有一个例子:

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 &)”:无法将参数 1 从“Foo”转换为“const double”

我怀疑在通过交换输入来测试函子的严格弱排序的实现中存在一些邪恶。是否有一种解决方法可以暂停对编译器的检查,或者我只需将我的仿函数更改为接收 2 Foos 并Foo在此处临时代表 2 ?

4

2 回答 2

1

正如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. 请注意,我使用的是 a #if,这意味着-block 仅在已定义且非 0if时才会执行。_HAS_ITERATOR_DEBUGGING在设计时 Visual Studio 2008 似乎总是认为它是未定义的
  2. comp如果您的特定情况需要comp在多个地方使用,我的代码定义了内联 1 st考虑将整个else-block 包装在一个函数中以限制#define代码中 s 的数量,显然如果您正在使用此注释的适用性将受到限制comp在多种标准算法中
于 2017-02-17T16:11:11.613 回答
-1

正如Algirdas Preidž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; }
};
于 2017-02-17T14:35:59.133 回答