Project

General

Profile

Actions

Bug #2612

open

Ambiguity between std::bind and std::tr1::bind

Added by Anonymous almost 4 years ago.

Status:
New
Priority:
Normal
Assignee:
-
Target version:
-
Start date:
12/08/2020
Due date:
% Done:

0%

Estimated time:

Description

As I mentioned in https://projects.vdr-developer.org/issues/2611, there are some changes to std::tr1::bind coming in GCC 11 which cause compilation errors in your code:

tasks.cpp: In member function ‘void vdrlive::TaskManager::DoScheduledTasks()’:
tasks.cpp:248:83: error: call of overloaded ‘bind(void (vdrlive::Task::*)(), const std::_Placeholder<1>&)’ is ambiguous
  248 |         for_each( m_taskQueue.begin(), m_taskQueue.end(), bind(&Task::Action, _1 ) );
      |                                                           ^
In file included from stdext.h:6,
                 from tasks.cpp:4:
/tmp/installed/include/c++/11.0.0/tr1/functional:1457:5: note: candidate: ‘std::tr1::_Bind<typename std::tr1::_Maybe_wrap_member_pointer<_Tp>::type(_ArgTypes ...)> std::tr1::bind(_Functor, _ArgTypes ...) [...]’
 1457 |     bind(_Functor __f, _ArgTypes... __args)
      |     ^~~~
In file included from /tmp/installed/include/c++/11.0.0/tr1/functional:34,
                 from stdext.h:6,
                 from tasks.cpp:4:
/tmp/installed/include/c++/11.0.0/functional:789:5: note: candidate: ‘typename std::_Bind_helper<std::__is_socketlike<_Func, typename std::decay<_Tp>::type>::value, _Func, _BoundArgs ...>::type std::bind(_Func&&,  BoundArgs&& ...) [...]’
  789 |     bind(_Func&& __f, _BoundArgs&&... __args)
      |     ^~~~

This happens because GCC defaults to modern C++ versions, which means std::bind is declared as well as std::tr1::bind. In GCC 11 the TR1 placeholders such as std::tr1::placeholders::_1 are now the same type as the C++11 placeholders such as std::placeholders::_1 and so the unqualified call to bind(..., _1) finds std::bind by Argument-Dependent Lookup as well as finding std::tr1::bind because of the using-declaration at the top of tasks.cpp.

Replacing all use of TR1 with the C++11 equivalents (as https://projects.vdr-developer.org/issues/2611 suggested) would be one fix. I think a minimal fix for the compilation error would be to just use std::bind in tasks.cpp e.g.

--- vdr-plugin-live-e582514ede475574842b44ca6792335ff141172d/tasks.cpp~ 2020-12-08 11:20:07.277317477 +0000
+++ vdr-plugin-live-e582514ede475574842b44ca6792335ff141172d/tasks.cpp  2020-12-08 11:20:11.112311582 +0000
@@ -16,8 +16,13 @@
 namespace vdrlive {

 using std::for_each;
+#if __cplusplus >= 201103L
+using std::bind;
+using namespace std::placeholders;
+#else
 using std::tr1::bind;
 using namespace std::tr1::placeholders;
+#endif

 const char* NowReplaying()
 {

No data to display

Actions

Also available in: Atom PDF