Рассмотрим следующие файлы:
a.cpp
:
#include <queue>
struct Event {
int a;
};
static bool operator<(const Event &a, const Event &b) {
return a.a < b.a;
}
void external_insert(std::priority_queue<Event> &pqu, Event event) {
pqu.push(event);
}
int main() {
// fails
std::priority_queue<Event> pqu;
external_insert(pqu, Event());
// works
// std::priority_queue<Event> pqu;
// pqu.push(Event());
return 0;
}
b.cpp
:
#include <queue>
struct Event {
int a, b;
};
static bool operator<(const Event &a, const Event &b) {
return a.a < b.a;
}
void some_unused_function() {
std::priority_queue<Event> evqu;
evqu.push(Event());
}
Затем скомпилируйте эти два файла в два исполняемых файла, используя:
g++ a.cpp b.cpp -o ab
g++ b.cpp a.cpp -o ba
И затем запустите оба с использованием valgrind:
valgrind ./ab
# ... ERROR SUMMARY: 0 errors from 0 contexts ...
valgrind ./ba
# ... ERROR SUMMARY: 2 errors from 2 contexts ...
Точный вывод команды valgrind для двух программ можно найти в this gist .
Не возникает ошибок при выполнении одной из следующих операций:
- Замена "Event" на любое другое имя в одном из двух файлов
- Создание обеих структур одинакового размера
- Выбор второго набора из двух строк в
main()
вместо первого - Замена использования
priority_queue
на vector
и использование push_back
вместо push
Я склонен полагать, что это проблема в компиляторе (ошибка компилятора?), Когда именование методов с использованием шаблона для двух версий priority_queue
конфликтует друг с другом.
Это известная проблема, это новая ошибка, или я что-то упустил?