class Coloreo {
vector<int> assigned_color;
bool compare (int a, int b) {
return assigned_color[a] < assigned_color[b];
}
public:
vector<int> coloreo_secuencial (Grafo & g) {
int n = g.size();
assigned_color.resize(n, -1);
assigned_color[0] = 0;
for (int u = 1; u < n; u++) {
int c = 0;
list<int> edges = g.getVerticesAdyacentes(u);
edges.sort(compare);
for (int v : edges) {
if (assigned_color[v] == c) {
c++;
}
}
assigned_color[u] = c;
}
return assigned_color;
}
};
Я хочу использовать comparador compare
чтобы упорядочивать список edges
: edges.sort(compare);
но он бросает в меня следующую ошибку: error: must use '.*' or '->*' to call pointer-to-member function in '__comp (...)', e.g. '(... ->* __comp) (...)'|
Любопытное - что, если я делаю все снаружи классом, если он позволяет мне делать это. С этим я отношусь, в который vector<int> assigned_color;
я это размещаю как глобально и остальные функции в main и пройди все добро, но когда я хочу поместить это в класс, он не оставляет меня.
В твоем случае compare
это - один funciГіn член Coloreo
, а именно, для того, чтобы этот вызов функционировал habrГ, - которому писать что-то сходное в:
edges.sort(compare(this));
Но просвет, он не будет составлять это в жизни.
OpciГіn 1
Возможная альтернатива состоит в том, чтобы конвертировать ее funciГіn в estГЎtica. Проблема, что ты находишься aquГ - он состоит в том, что она funciГіn compare
использует assigned_color
, которые это - изменчивая член Coloreo
... эта переменная tambiГ©n deberГ, - чтобы быть estГЎtica:
class Coloreo {
static vector<int> assigned_color;
static bool compare (int a, int b) {
Из этой формы уже sГ - deberГ, - чтобы тебя функционировать, так как сейчас compare
, как весь funciГіn estГЎtica, не precisarГЎ инстанции Coloreo
.
Итак, в зависимости от оставшейся части cГіdigo, который ты не поместил в вопрос, возможно, что opciГіn, не было применимым к твоему случаю... в этом случае мы нуждаемся в адаптере, чтобы мочь призывать к this->compare
внутри нее funciГіn sort
. Если C ++ 11 - один opciГіn, мы можем использовать одну funciГіn lambda:
edges.sort([this](int a, int b){ return this->compare(a,b); });
то, что он делает этим lambda, состоит в том, чтобы оставлять себе this
, указатель, который указывает на инстанцию Coloreo
, и использовать это, чтобы мочь звонить в нее funciГіn член compare
.
OpciГіn 2
Si lambdas не одни opciГіn он у тебя остается она opciГіn использования класса:
struct Coloreo {
struct Adaptador
{
Coloreo & instancia;
Adaptador(Coloreo & instancia)
: instancia(instancia)
{ }
bool operator()(int a, int b)
{ return instancia.compare(a, b); }
};
// ...
edges.sort(Adaptador(*this));
В этом случае адаптер осуществляет оператор funciГіn. Ваш lГіgica он эквивалентный тому lambda.
Adaptador(Coloreo & instancia) : instancia(instancia) { }
я не понимаю это решение. – Guido Modarelli 11.03.2019, 12:14this
, чтобы удалять ambigü возраст. Это sí ссылки не могут инициализироваться другой формы – eferion 11.03.2019, 12:21