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
}
这里有几个注释:
- 请注意,我使用的是
#if
,这意味着if
-Block仅在定义_HAS_ITERATOR_DEBUGGING
且为non -0时才能执行。在设计时,Visual Studio 2008似乎总是认为它是不确定的 - 我的代码将
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; }
};