ChimeraTK / ControlSystemAdapter

An adapter layer which allows to use control applications with different control system software environments.
GNU Lesser General Public License v3.0
3 stars 2 forks source link

Compiling testUnifiedTypeChangingDecorator.cpp with Clang fails #57

Closed smarsching closed 2 years ago

smarsching commented 2 years ago

When compiling the control-system adapter with Clang 12.0 (on macOS 12.6, x86_64) there is a problem when compiling testUnifiedTypeChangingDecorator.cpp. The error message is very, very long, so I am not reproducing it here, but the problem seems to boil down to the fact that in BOOST_AUTO_TEST_CASE(testRegisterAccessor), we instantiate sub-classes of TestRegister specifying the type long as the template parameter.

When replacing long with int32_t or int64_t, the code compiles without any issues, so I think that this is caused by the fact that in SupportedUserTypes.h (from DeviceAccess), int32_t and int64_t are listed but long is not. Interestingly, int is listed neither, but can be used.

I suspect that Clang (at least the version of Clang provided for macOS 12), does not assume that long == int64_t for the purpose of overload / template resolution. I think that this might be related to the problem with size_t and uint64_t that we saw in DeviceAccess (see https://github.com/ChimeraTK/DeviceAccess/issues/281).

I didn’t find anything about this in the Clang documentation, but I found a discussion about the same problem from a few years ago: https://comp.lang.cpp.narkive.com/kH1S9MDr/int32-t-vs-int64-t-vs-long-ambiguous

The behavior of Clang actually makes sense, because the nasty thing about long is that it might be 32 or 64 bit depending on the platform (see https://en.cppreference.com/w/cpp/language/types), so overload / template resolution would depend on the platform, which could result in some very hard to find problems.

In general, mixing the fixed-size integer types with the platform-dependent types is a bad idea, so I think we should replace int and long in testUnifiedTypeChangingDecorator.cpp with int32_t and int64_t respectively. Using int is not quite as problematic as long because sizeof(int) == 4 seems to be true on most platforms (Win16 being one notable exception, but I don’t think that Clang even supports this platform), but using this in this context still is not entriely clean, so I would like to avoid it.

Are there any objections?

mhier commented 2 years ago

We should use int32_t, uint64_t etc. always when specifying the UserType template argument of the DeviceAccess accessors and in related places. The use of int is at least sloppy, the use of long and size_t etc. is certainly wrong, for the exact reasons you are quoting.

The very long error message probably also points to some missing static_assert somewhere (potentially DeviceAccess? Maybe can you send me the error message somehow to confirm?), which could give a clearer error message if wrong types are used...

So in short, yes I agree.

smarsching commented 2 years ago

Thanks for your feedback. I created PR #58 to address this problem. Maybe you could be so kind and review it.

Here is the full error message. I only changed one use of int64_t to long in order to keept it as short as possible, but it is still quite long. At least some of the length can probably be explained by the use of Boost Fusion.

Building CXX object CMakeFiles/testUnifiedTypeChangingDecorator.dir/tests/src/testUnifiedTypeChangingDecorator.cpp.o
In file included from /Users/termi/Documents/ChimeraTK/ControlSystemAdapter/tests/src/testUnifiedTypeChangingDecorator.cpp:4:
In file included from /usr/local/include/boost/test/included/unit_test.hpp:18:
In file included from /usr/local/include/boost/test/impl/compiler_log_formatter.ipp:22:
In file included from /usr/local/include/boost/test/execution_monitor.hpp:28:
In file included from /usr/local/include/boost/function/function0.hpp:11:
In file included from /usr/local/include/boost/function/detail/maybe_include.hpp:15:
In file included from /usr/local/include/boost/function/function_template.hpp:13:
In file included from /usr/local/include/boost/function/detail/prologue.hpp:17:
In file included from /usr/local/include/boost/function/function_base.hpp:21:
In file included from /usr/local/include/boost/type_index.hpp:29:
In file included from /usr/local/include/boost/type_index/stl_type_index.hpp:47:
In file included from /usr/local/include/boost/container_hash/hash.hpp:22:
In file included from /usr/local/include/boost/container_hash/detail/hash_float.hpp:16:
/usr/local/include/boost/core/enable_if.hpp:68:25: error: no type named 'type'
      in
      'boost::fusion::result_of::at_key<boost::fusion::map<boost::fusion::pair<signed
      char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<signed
      char> >, boost::fusion::pair<unsigned char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      char> >, boost::fusion::pair<short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<short>
      >, boost::fusion::pair<unsigned short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      short> >, boost::fusion::pair<int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<int>
      >, boost::fusion::pair<unsigned int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      int> >, boost::fusion::pair<long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<long
      long> >, boost::fusion::pair<unsigned long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      long long> >, boost::fusion::pair<float,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<float>
      >, boost::fusion::pair<double,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<double>
      >, boost::fusion::pair<std::__1::basic_string<char>,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<std::__1::basic_string<char>
      > >, boost::fusion::pair<ChimeraTK::Boolean,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Boolean>
      >, boost::fusion::pair<ChimeraTK::Void,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Void>
      > >, long>'
    typedef typename T::type type;
            ~~~~~~~~~~~~^~~~
/usr/local/include/boost/core/enable_if.hpp:75:35: note: in instantiation of
      template class 'boost::lazy_disable_if_c<false,
      boost::fusion::result_of::at_key<boost::fusion::map<boost::fusion::pair<signed
      char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<signed
      char> >, boost::fusion::pair<unsigned char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      char> >, boost::fusion::pair<short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<short>
      >, boost::fusion::pair<unsigned short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      short> >, boost::fusion::pair<int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<int>
      >, boost::fusion::pair<unsigned int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      int> >, boost::fusion::pair<long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<long
      long> >, boost::fusion::pair<unsigned long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      long long> >, boost::fusion::pair<float,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<float>
      >, boost::fusion::pair<double,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<double>
      >, boost::fusion::pair<std::__1::basic_string<char>,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<std::__1::basic_string<char>
      > >, boost::fusion::pair<ChimeraTK::Boolean,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Boolean>
      >, boost::fusion::pair<ChimeraTK::Void,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Void>
      > >, long> >' requested here
  struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {};
                                  ^
/usr/local/include/boost/fusion/sequence/intrinsic/at_key.hpp:98:9: note: in
      instantiation of template class
      'boost::lazy_disable_if<boost::is_const<boost::fusion::map<boost::fusion::pair<signed
      char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<signed
      char> >, boost::fusion::pair<unsigned char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      char> >, boost::fusion::pair<short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<short>
      >, boost::fusion::pair<unsigned short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      short> >, boost::fusion::pair<int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<int>
      >, boost::fusion::pair<unsigned int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      int> >, boost::fusion::pair<long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<long
      long> >, boost::fusion::pair<unsigned long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      long long> >, boost::fusion::pair<float,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<float>
      >, boost::fusion::pair<double,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<double>
      >, boost::fusion::pair<std::__1::basic_string<char>,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<std::__1::basic_string<char>
      > >, boost::fusion::pair<ChimeraTK::Boolean,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Boolean>
      >, boost::fusion::pair<ChimeraTK::Void,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Void>
      > > >,
      boost::fusion::result_of::at_key<boost::fusion::map<boost::fusion::pair<signed
      char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<signed
      char> >, boost::fusion::pair<unsigned char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      char> >, boost::fusion::pair<short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<short>
      >, boost::fusion::pair<unsigned short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      short> >, boost::fusion::pair<int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<int>
      >, boost::fusion::pair<unsigned int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      int> >, boost::fusion::pair<long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<long
      long> >, boost::fusion::pair<unsigned long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      long long> >, boost::fusion::pair<float,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<float>
      >, boost::fusion::pair<double,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<double>
      >, boost::fusion::pair<std::__1::basic_string<char>,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<std::__1::basic_string<char>
      > >, boost::fusion::pair<ChimeraTK::Boolean,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Boolean>
      >, boost::fusion::pair<ChimeraTK::Void,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Void>
      > >, long> >' requested here
        lazy_disable_if<
        ^
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/DeviceBackend.h:99:12: note: 
      while substituting deduced template arguments into function template
      'at_key' [with Key = long, Sequence =
      boost::fusion::map<boost::fusion::pair<signed char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<signed
      char> >, boost::fusion::pair<unsigned char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      char> >, boost::fusion::pair<short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<short>
      >, boost::fusion::pair<unsigned short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      short> >, boost::fusion::pair<int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<int>
      >, boost::fusion::pair<unsigned int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      int> >, boost::fusion::pair<long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<long
      long> >, boost::fusion::pair<unsigned long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      long long> >, boost::fusion::pair<float,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<float>
      >, boost::fusion::pair<double,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<double>
      >, boost::fusion::pair<std::__1::basic_string<char>,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<std::__1::basic_string<char>
      > >, boost::fusion::pair<ChimeraTK::Boolean,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Boolean>
      >, boost::fusion::pair<ChimeraTK::Void,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Void>
      > >]
    return CALL_VIRTUAL_FUNCTION_TEMPLATE(
           ^
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/VirtualFunctionTemplate.h:73:3: note: 
      expanded from macro 'CALL_VIRTUAL_FUNCTION_TEMPLATE'
  boost::fusion::at_key<templateArgument>(functionName##_vtable.table)(_...
  ^
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/Device.h:286:66: note: in
      instantiation of function template specialization
      'ChimeraTK::DeviceBackend::getRegisterAccessor<long>' requested here
    return TwoDRegisterAccessor<UserType>(_deviceBackendPointer->getRegi...
                                                                 ^
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:981:20: note: 
      in instantiation of function template specialization
      'ChimeraTK::Device::getTwoDRegisterAccessor<long>' requested here
      auto reg = d.getTwoDRegisterAccessor<UserType>(registerName);
                   ^
/usr/local/include/boost/mpl/for_each.hpp:105:11: note: in instantiation of
      function template specialization
      'boost::mpl::aux::for_each_impl<false>::execute<boost::mpl::v_iter<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>,
      boost::mpl::v_iter<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 12>,
      boost::mpl::identity<mpl_::na>, (lambda at
      /Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:976:49)>'
      requested here
        ::execute(static_cast<first*>(0), static_cast<last*>(0), static_...
          ^
/usr/local/include/boost/mpl/for_each.hpp:118:15: note: in instantiation of
      function template specialization
      'boost::mpl::for_each<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>,
      boost::mpl::identity<mpl_::na>, (lambda at
      /Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:976:49)>'
      requested here
  boost::mpl::for_each<Sequence, identity<> >(f);
              ^
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:976:17: note: 
      in instantiation of function template specialization
      'boost::mpl::for_each<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, (lambda at
      /Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:976:49)>'
      requested here
    boost::mpl::for_each<VECTOR_OF_REGISTERS_T>([&](auto x) {
                ^
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:905:5: note: 
      in instantiation of member function
      'ChimeraTK::UnifiedBackendTest<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>
      >::test_B_3_1_2_1' requested here
    test_B_3_1_2_1();
    ^
/Users/termi/Documents/ChimeraTK/ControlSystemAdapter/tests/src/testUnifiedTypeChangingDecorator.cpp:237:8: note: 
      in instantiation of member function
      'ChimeraTK::UnifiedBackendTest<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0> >::runTests'
      requested here
      .runTests(cdd);
       ^
In file included from /Users/termi/Documents/ChimeraTK/ControlSystemAdapter/tests/src/testUnifiedTypeChangingDecorator.cpp:8:
In file included from /Users/termi/Applications/ChimeraTK/include/ChimeraTK/Device.h:6:
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/DeviceBackend.h:99:12: error: 
      no matching function for call to 'at_key'
    return CALL_VIRTUAL_FUNCTION_TEMPLATE(
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/VirtualFunctionTemplate.h:73:3: note: 
      expanded from macro 'CALL_VIRTUAL_FUNCTION_TEMPLATE'
  boost::fusion::at_key<templateArgument>(functionName##_vtable.table)(_...
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/Device.h:286:66: note: in
      instantiation of function template specialization
      'ChimeraTK::DeviceBackend::getRegisterAccessor<long>' requested here
    return TwoDRegisterAccessor<UserType>(_deviceBackendPointer->getRegi...
                                                                 ^
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:981:20: note: 
      in instantiation of function template specialization
      'ChimeraTK::Device::getTwoDRegisterAccessor<long>' requested here
      auto reg = d.getTwoDRegisterAccessor<UserType>(registerName);
                   ^
/usr/local/include/boost/mpl/for_each.hpp:105:11: note: in instantiation of
      function template specialization
      'boost::mpl::aux::for_each_impl<false>::execute<boost::mpl::v_iter<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>,
      boost::mpl::v_iter<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 12>,
      boost::mpl::identity<mpl_::na>, (lambda at
      /Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:976:49)>'
      requested here
        ::execute(static_cast<first*>(0), static_cast<last*>(0), static_...
          ^
/usr/local/include/boost/mpl/for_each.hpp:118:15: note: in instantiation of
      function template specialization
      'boost::mpl::for_each<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>,
      boost::mpl::identity<mpl_::na>, (lambda at
      /Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:976:49)>'
      requested here
  boost::mpl::for_each<Sequence, identity<> >(f);
              ^
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:976:17: note: 
      in instantiation of function template specialization
      'boost::mpl::for_each<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, (lambda at
      /Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:976:49)>'
      requested here
    boost::mpl::for_each<VECTOR_OF_REGISTERS_T>([&](auto x) {
                ^
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:905:5: note: 
      in instantiation of member function
      'ChimeraTK::UnifiedBackendTest<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>
      >::test_B_3_1_2_1' requested here
    test_B_3_1_2_1();
    ^
/Users/termi/Documents/ChimeraTK/ControlSystemAdapter/tests/src/testUnifiedTypeChangingDecorator.cpp:237:8: note: 
      in instantiation of member function
      'ChimeraTK::UnifiedBackendTest<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0> >::runTests'
      requested here
      .runTests(cdd);
       ^
/usr/local/include/boost/fusion/sequence/intrinsic/at_key.hpp:102:5: note: 
      candidate template ignored: substitution failure [with Key = long,
      Sequence = boost::fusion::map<boost::fusion::pair<signed char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<signed
      char> >, boost::fusion::pair<unsigned char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      char> >, boost::fusion::pair<short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<short>
      >, boost::fusion::pair<unsigned short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      short> >, boost::fusion::pair<int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<int>
      >, boost::fusion::pair<unsigned int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      int> >, boost::fusion::pair<long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<long
      long> >, boost::fusion::pair<unsigned long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      long long> >, boost::fusion::pair<float,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<float>
      >, boost::fusion::pair<double,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<double>
      >, boost::fusion::pair<std::__1::basic_string<char>,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<std::__1::basic_string<char>
      > >, boost::fusion::pair<ChimeraTK::Boolean,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Boolean>
      >, boost::fusion::pair<ChimeraTK::Void,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Void>
      > >]
    at_key(Sequence& seq)
    ^
/usr/local/include/boost/fusion/sequence/intrinsic/at_key.hpp:110:5: note: 
      candidate template ignored: substitution failure [with Key = long,
      Sequence = boost::fusion::map<boost::fusion::pair<signed char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<signed
      char> >, boost::fusion::pair<unsigned char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      char> >, boost::fusion::pair<short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<short>
      >, boost::fusion::pair<unsigned short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      short> >, boost::fusion::pair<int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<int>
      >, boost::fusion::pair<unsigned int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      int> >, boost::fusion::pair<long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<long
      long> >, boost::fusion::pair<unsigned long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      long long> >, boost::fusion::pair<float,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<float>
      >, boost::fusion::pair<double,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<double>
      >, boost::fusion::pair<std::__1::basic_string<char>,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<std::__1::basic_string<char>
      > >, boost::fusion::pair<ChimeraTK::Boolean,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Boolean>
      >, boost::fusion::pair<ChimeraTK::Void,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Void>
      > >]: no type named 'type' in 'boost::fusion::result_of::at_key<const
      boost::fusion::map<boost::fusion::pair<signed char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<signed
      char> >, boost::fusion::pair<unsigned char,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      char> >, boost::fusion::pair<short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<short>
      >, boost::fusion::pair<unsigned short,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      short> >, boost::fusion::pair<int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<int>
      >, boost::fusion::pair<unsigned int,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      int> >, boost::fusion::pair<long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<long
      long> >, boost::fusion::pair<unsigned long long,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<unsigned
      long long> >, boost::fusion::pair<float,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<float>
      >, boost::fusion::pair<double,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<double>
      >, boost::fusion::pair<std::__1::basic_string<char>,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<std::__1::basic_string<char>
      > >, boost::fusion::pair<ChimeraTK::Boolean,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Boolean>
      >, boost::fusion::pair<ChimeraTK::Void,
      ChimeraTK::DeviceBackend::getRegisterAccessor_impl_functionSignature<ChimeraTK::Void>
      > >, long>'
    at_key(Sequence const& seq)
    ^
In file included from /Users/termi/Documents/ChimeraTK/ControlSystemAdapter/tests/src/testUnifiedTypeChangingDecorator.cpp:8:
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/Device.h:267:32: error: 
      no matching member function for call to 'getRegisterAccessor'
        _deviceBackendPointer->getRegisterAccessor<UserType>(registerPat...
        ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:3486:25: note: 
      in instantiation of function template specialization
      'ChimeraTK::Device::getScalarRegisterAccessor<long>' requested here
      auto accessor = d.getScalarRegisterAccessor<UserType>(registerName);
                        ^
/usr/local/include/boost/mpl/for_each.hpp:105:11: note: in instantiation of
      function template specialization
      'boost::mpl::aux::for_each_impl<false>::execute<boost::mpl::v_iter<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>,
      boost::mpl::v_iter<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 12>,
      boost::mpl::identity<mpl_::na>, (lambda at
      /Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:3466:49)>'
      requested here
        ::execute(static_cast<first*>(0), static_cast<last*>(0), static_...
          ^
/usr/local/include/boost/mpl/for_each.hpp:118:15: note: in instantiation of
      function template specialization
      'boost::mpl::for_each<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>,
      boost::mpl::identity<mpl_::na>, (lambda at
      /Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:3466:49)>'
      requested here
  boost::mpl::for_each<Sequence, identity<> >(f);
              ^
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:3466:17: note: 
      in instantiation of function template specialization
      'boost::mpl::for_each<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, (lambda at
      /Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:3466:49)>'
      requested here
    boost::mpl::for_each<VECTOR_OF_REGISTERS_T>([&](auto x) {
                ^
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/UnifiedBackendTest.h:943:5: note: 
      in instantiation of member function
      'ChimeraTK::UnifiedBackendTest<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>
      >::test_NOSPEC_catalogueReadWrite' requested here
    test_NOSPEC_catalogueReadWrite();
    ^
/Users/termi/Documents/ChimeraTK/ControlSystemAdapter/tests/src/testUnifiedTypeChangingDecorator.cpp:237:8: note: 
      in instantiation of member function
      'ChimeraTK::UnifiedBackendTest<boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<float>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRangeChecked<int>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsyncRo<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCastedAsync<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterRoCasted<long
      long>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<double>,
      boost::mpl::v_item<TypeChangingDecoratorUnifiedTest::TestRegisterCasted<long>,
      boost::mpl::vector<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
      mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0> >::runTests'
      requested here
      .runTests(cdd);
       ^
/Users/termi/Applications/ChimeraTK/include/ChimeraTK/DeviceBackend.h:97:66: note: 
      candidate template ignored: substitution failure [with UserType = long]
  boost::shared_ptr<NDRegisterAccessor<UserType>> DeviceBackend::getRegi...
                                                                 ^
3 errors generated.