2016-09-30 2 views
0

Я пытаюсь определить очередь приоритета с настраиваемыми компаратора следующим образом:Определение очереди приоритета внутри класса с пользовательской функцией сравнения

typedef bool (*comp)(int,int); 

bool compare(int exp1,int exp2){ 
    return (exp1 > exp2); 
} 

class test{ 
public: 
    priority_queue<int,vector<int>,comp> test_pq(compare); // Gives compilation error 
}; 

int main() 
{ 
    priority_queue<int,vector<int>,comp> pq(compare); // Compiles perfectly 
    return 0; 
} 

Это ошибка компиляции, которая показывает вверх

test.cpp:18:47: error: ‘compare’ is not a type 
    priority_queue<int,vector<int>,comp> test_pq(compare); 
              ^

Я также попытался объявить другую функцию сравнения внутри тестового класса без эффекта. Почему очередь приоритетов в основной функции компилируется, а внутри внутри класса нет? Является ли определение выделенного класса для компаратора единственной работой здесь? Спасибо.

ответ

3

Ваш код в test класс пытается объявить способ test_pq с неправильной подписью.

Чтобы определить переменную-член можно использовать фигурные скобки в инициализации (C++ 11 требуется):

class test{ 
public: 
    priority_queue<int,vector<int>,comp> test_pq{compare}; 
}; 

Чтобы добиться того же в предварительно C++ 11 вы должны написать пользовательский конструктор для test класса:

class test 
{ 
public: 
    test() 
     : test_pq(compare) 
    { 
     // Constructor code here 
    } 
private: 
    priority_queue<int,vector<int>,comp> test_pq; 
}; 
+0

Спасибо за сквозной ответ :) Но разве нет способа заставить его работать независимо от версии? Скажем, изменив инициализацию на конструктор класса? –

+0

@ ant_1618, да, конечно, вы можете это сделать. Я обновил ответ, чтобы включить этот вариант. Но если вы уже знаете слова 'initialization' и' constructor', я бы ожидал, что вы уже знаете ответ ... =) – magras

+0

Я не знал о том, как cpp инициализирует переменные-члены неявно в конструкторе с помощью 'Test(): [initialisation list] {\\ code} '. Итак, я не мог ответить на этот вопрос: P Теперь понятно: D Спасибо :) –