2015-05-28 3 views
1

Я читал this вопрос, и это мне не помогает.Использование функции сравнения для типа ключа для наборов приводит к ошибке во время выполнения

Мой вопрос: Почему я получаю ошибку времени выполнения при использовании функции сравнения для типа ключа для set, как показано ниже?

multiset<Phone, decltype(comp)*> phones { Phone(911), Phone(112) }; 
       //^^^^^^^^^^^^^^^ 

В VC2013 это дает мне это для приведенного выше кода:

Unhandled exception at 0x73DECB49 in debugit.exe: 0xC0000005: Access violation executing location 0x00000000.

Вот небольшой пример, который дает ошибку:

#include <iostream> 
#include <algorithm> 
#include <string> 
#include <set> 
using namespace std; 

struct Phone { 
    Phone(long long const &num) : number{num} {} 
    long long number; 
}; 

// compare function: 
bool comp(Phone const &n1, Phone const &n2) { return n1.number < n2.number; } 

int main() 
{ // The below line produces the runtime error. 
    multiset<Phone, decltype(comp)*> phones { Phone(911), Phone(112) }; 
} 

Я не могу видеть, что я я делаю неправильно здесь. Я скомпилирован с VC2013 и g ++ (GCC) 4.9.1, и оба результата совпадают.

+0

возможно дубликат [Инициализация мультимножество с пользовательской функцией сравнения в C++] (http://stackoverflow.com/questions/18718379/initializing-multiset-with-custom-compare-function-in-c) – NathanOliver

+0

Вам нужно предоставить экземпляр 'decltype (comp) *'. Например. 'phones ({...}, & comp)'. –

+0

Не используйте целые числа для отображения номеров телефонов. Это не помогло бы мне (и большинству номеров в моей стране). –

ответ

2

decltype(comp)* - это просто указатель на функцию с подписью bool(Phone const&, Phone const&). Он получает значение, инициализированное nullptr. Конструктор std::initializer_liststd::multiset использует это как параметр по умолчанию для объекта Compare. Поскольку вы инициализировали свой std::multiset с помощью указателя нулевой функции в качестве компаратора, его вызов может привести к segfault.

Чтобы исправить это, предоставить действительный экземпляр Compare объекта, как это:

multiset<Phone, decltype(comp)*> phones {{ Phone(911), Phone(112)}, &comp}; 
Смежные вопросы