首先在这里发帖,这是我第一次自己提出问题:我已经找到了答案,但我找不到答案。
我收到错误" Expression: vector iterators incompatible
"在使用Visual Studio 2013的调试模式下。这个错误的通常原因是在for中,迭代器不指向同一个对象,或者因为循环期间的重新分配而导致结束迭代器无效,但是这里我没有&#39看到类似的东西......
错误发生在我的LogicFormula类的复制构造函数中:
struct LogicFormula {
id_t ID;
type_t type_formula;
operator_t type_operator;
bool bool_value;
std::string name;
ListOfConstants *list_of_constants;
std::vector<LogicFormula*> children;
LogicFormula(const LogicFormula &original) {
type_formula = original.type_formula;
type_operator = original.type_operator;
bool_value = original.bool_value;
name = original.name;
for (std::vector<LogicFormula*>::const_iterator it =
original.children.cbegin(); it != original.children.cend(); ++it)
children.push_back(new LogicFormula(**it));
if (original.list_of_constants)
list_of_constants = new ListOfConstants(*(original.list_of_constants));
else
list_of_constants = NULL;
}
LogicFormula(bool value) {
type_formula = PROPOSITIONAL_CONSTANT;
type_operator = LEAF;
bool_value = value;
list_of_constants = NULL;
}
// [...]
};
在以下行检测到错误:
for (std::vector<LogicFormula*>::const_iterator it =
original.children.cbegin(); it != original.children.cend(); ++it)
我做了一个引发错误的最小主函数:
int main ( int argc, char* argv[] ) {
LogicFormula a(true);
a = testLogic();
return 0;
}
我希望我能给你一切,如果我的英语不好,我很抱歉:我是法国人。
编辑:对不起,我忘了给testLogic函数了:LogicFormula testLogic(void) {
LogicFormula f(true);
return f;
}
然后由return f;
仅供参考,id_t
,type_t
,operator_t
是枚举类型(在LogicFormula类中使用枚举声明),大写字符事物只是这些类型的常量(工作正常)在程序的其余部分)和ListOfConstants
是另一个类,但我不认为这很重要,实际上在这个测试中,向量original.children为空,original.list_of_constraints
为NULL。 。
并且错误是运行时错误,它编译得很好......
答案 0 :(得分:0)
我执行了您的代码(不包括某些变量,例如id
,type_formula
),没有任何问题。你确定main
中的代码是你所拥有的吗?
问题可能出在这一行:
a = testLogic();
请注意,assignment
不是copy
。因此,该语句将使用编译器生成的operator=
用于类LogicFormula
,而不是使用copy constructor
。默认operator=
将逐位复制list_of_constants
和children
,而不是循环访问容器。 f
中的testLogic
将被销毁,list_of_constants
和children
也将被销毁。因此,在作业a
之后会有无效成员。
另一个问题可能是你没有在构造函数中初始化children
。 testLogic
的返回值将使用copy constructor
复制,{I}}将尝试访问children
。