Мне нужно использовать старый код устаревшего кода, который использует std::tr1::shared_ptr
. Заголовок, который мне нужно включить, имеет как #include <tr1/memory>
, так и #include <tr1/functional>
. В моем коде я хочу использовать std::function
и std::bind
, так как наш компилятор поддерживает их.Смешивание std :: tr1 :: shared_ptr с std :: function/std :: bind вызывает ошибки компилятора с новым gcc
Это прекрасно работает с gcc 4.6.3 и 4.7.3. В 4.9.2, 5.1.x и 5.2.0 это приводит к ошибке компилятора. Кажется, это происходит из-за <tr1/functional>
-include.
я написал небольшой пример, который воспроизводит эту проблему:
#include <tr1/memory>
#include <functional>
#include <tr1/functional>
struct Foo {
void test(std::tr1::shared_ptr<int> i) {}
};
int main() {
Foo f;
std::function<void(std::tr1::shared_ptr<int>)> func = std::bind(&Foo::test, f, std::placeholders::_1);
return 0;
}
GCC-4.6.3, без #include <tr1/functional>
, компилирует КИ. Протестировано на моей локальной машине.
gcc-4.6.3, с #include <tr1/functional>
, компилирует ОК. Протестировано на моей локальной машине.
НКУ-5,1, без #include <tr1/functional>
, компилирует OK: http://ideone.com/XrkAXT
НКУ-5,1, с #include <tr1/functional>
, ошибка компилятора: http://ideone.com/sRWQLn
Я не использую любой std::tr1::function
или std::tr1::bind
вообще, и единственное, Я использую из устаревшего кода объект std::tr1::shared_ptr
.
Почему #include <tr1/functional>
влияет на не-tr1 std::function
/std::bind
? Или что здесь происходит?
Редактировать: Согласно GNU C++ Library Manual, Chapter 3: «Частным случаем второго правила является смешивание объектов TR1 и C++ 11. Возможно, хотя и не особенно разумным, включить как версию TR1, так и C + +11 версия заголовка в той же системе перевода «
Clang несколько более полезен и сообщает о [двусмысленности] (http://coliru.stacked-crooked.com/a/42b7d781e2829fb7). Я собираюсь догадаться о ADL. –
не так, потому что вы включили как функциональные, так и tr1/functional? – sop
@sop См. Мое редактирование. – gurka