As per the Gecode documentation "Modelling and Programming with Gecode", an IntVar
can be created with IntSet
This is also confirmed by Gecode's reference for IntVar
at https://www.gecode.org/doc/6.2.0/reference/classGecode_1_1IntVar.html
And an IntSet
can be created using a vector<int>
as per https://www.gecode.org/doc/6.2.0/reference/classGecode_1_1IntSet.html
But the following code
std::vector<int> values = {2, 4, 6, 8};
IntVar i;
Class() : i(*this, IntSet(values)) {
}
gives me an error message that looks something like this
In file included from $GECODE_HOME/include/gecode/int.hh:356,
from bla.cc:3:
$GECODE_HOME/include/gecode/int/int-set-1.hpp: In instantiation of ‘static void Gecode::IntSetInit<I>::init(Gecode::IntSet&, I&) [with I = std::vector<int>]’:
$GECODE_HOME/include/gecode/int/int-set-1.hpp:87:24: required from ‘Gecode::IntSet::IntSet(I&) [with I = std::vector<int>]’
bla.cc:14:35: required from here
$GECODE_HOME/include/gecode/int/int-set-1.hpp:61:15: error: no match for call to ‘(std::vector<int>) ()’
61 | while (i()) {
| ~^~
$GECODE_HOME/include/gecode/int/int-set-1.hpp:62:22: error: ‘class std::vector<int>’ has no member named ‘min’
62 | d[n].min = i.min(); d[n].max = i.max(); size += i.width();
| ~~^~~
$GECODE_HOME/include/gecode/int/int-set-1.hpp:62:42: error: ‘class std::vector<int>’ has no member named ‘max’
62 | d[n].min = i.min(); d[n].max = i.max(); size += i.width();
| ~~^~~
$GECODE_HOME/include/gecode/int/int-set-1.hpp:62:59: error: ‘class std::vector<int>’ has no member named ‘width’
62 | d[n].min = i.min(); d[n].max = i.max(); size += i.width();
| ~~^~~~~
$GECODE_HOME/include/gecode/int/int-set-1.hpp:63:14: error: no match for ‘operator++’ (operand type is ‘std::vector<int>’)
63 | ++n; ++i;
| ^~~
Full code
#include <vector>
#include <gecode/int.hh>
#include <gecode/search.hh>
#include <gecode/minimodel.hh>
using namespace Gecode;
class Class : public Space {
public:
std::vector<int> values = {2, 4, 6, 8};
IntVar i;
Class() : i(*this, IntSet(values)) {
}
// search support
Class(Class& s) : Space(s) {
i.update(*this, s.i);
}
virtual Space* copy(void) {
return new Class(*this);
}
// print solution
void print() {
std::cout << i << "\n";
}
};
int main(int argc, char* argv[]) {
Class* c = new Class;
DFS<Class> e(c);
delete c;
while (Class* s = e.next()) {
s->print(); delete s;
}
return 0;
}
Command to compile
g++ -std=c++20 -O3 -I $GECODE_HOME/include -L$GECODE_HOME/lib -lgecodesearch -lgecodeminimodel -lgecodeint -lgecodekernel -lgecodesupport bla.cc
What am I missing here? Do I misunderstand something?
Aucun commentaire:
Enregistrer un commentaire