Build failure with boost::multiprecision type
Eigen and boost::multiprecision don't play nicely together. At commit fdf2ee62 I get the following build error with the files
.gitmodules:
[submodule "externals/boost-cmake"]
path = externals/boost-cmake
url = https://github.com/Orphis/boost-cmake.git
[submodule "externals/eigen"]
path = externals/eigen
url = https://gitlab.com/libeigen/eigen.git
CMakeLists.txt:
cmake_minimum_required(VERSION 3.12)
project(boostfail)
set(CMAKE_CXX_STANDARD 17)
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/externals/boost-cmake")
add_executable(main main.cpp)
target_link_libraries(main Boost::boost)
target_include_directories(main
PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/externals/eigen"
)
and main.cpp:
#include <iostream>
#include <boost/multiprecision/cpp_complex.hpp>
#include <boost/multiprecision/eigen.hpp>
#include <Eigen/Dense>
int main()
{
using namespace Eigen;
typedef boost::multiprecision::cpp_complex_quad complex_type;
//
// We want to solve Ax = b for x,
// define A and b first:
//
Matrix<complex_type, 2, 2> A, b;
A << complex_type(2, 3), complex_type(-1, -2), complex_type(-1, -4), complex_type(3, 6);
b << 1, 2, 3, 1;
std::cout << "Here is the matrix A:\n" << A << std::endl;
std::cout << "Here is the right hand side b:\n" << b << std::endl;
//
// Solve for x:
//
Matrix<complex_type, 2, 2> x = A.fullPivHouseholderQr().solve(b);
std::cout << "The solution is:\n" << x << std::endl;
//
// Compute the error in the solution by using the norms of Ax - b and b:
//
complex_type::value_type relative_error = (A*x - b).norm() / b.norm();
std::cout << "The relative error is: " << relative_error << std::endl;
return 0;
}
yielding
(base) PS C:\Users\ian\Code\boostfail\bld> cmake --build . --config Release
CMake is re-running because C:/Users/ian/Code/boostfail/bld/CMakeFiles/generate.stamp is out-of-date.
the file 'C:/Users/ian/Code/boostfail/CMakeLists.txt'
is newer than 'C:/Users/ian/Code/boostfail/bld/CMakeFiles/generate.stamp.depend'
result='-1'
-- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.19041.
-- Fetching Boost
-- Fetching Boost - done
-- Boost found: 1.71.0 C:/Users/ian/Code/boostfail/bld/_deps/boost-src
-- Could NOT find BZip2 (missing: BZIP2_LIBRARIES BZIP2_INCLUDE_DIR)
-- The following ICU libraries were not found:
-- uc (required)
-- dt (required)
-- i18n (required)
-- Failed to find all ICU components (missing: ICU_INCLUDE_DIR ICU_LIBRARY _ICU_REQUIRED_LIBS_FOUND)
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/ian/Code/boostfail/bld
Microsoft (R) Build Engine version 16.6.0+5ff7b0c9e for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.
Checking Build System
Building Custom Rule C:/Users/ian/Code/boostfail/CMakeLists.txt
main.cpp
C:\Users\ian\Code\boostfail\bld\_deps\boost-src\boost/multiprecision/eigen.hpp(147,23): error C2977: 'Eigen::internal::conj_impl': too many template arguments [C:\Users\ian\Code\boostfai
l\bld\main.vcxproj]
C:\Users\ian\Code\boostfail\bld\_deps\boost-src\boost/multiprecision/eigen.hpp(147): message : see declaration of 'Eigen::internal::conj_impl' [C:\Users\ian\Code\boostfail\bld\main.vcxpr
oj]
C:\Users\ian\Code\boostfail\bld\_deps\boost-src\boost/multiprecision/eigen.hpp(164,8): error C2977: 'Eigen::internal::conj_impl': too many template arguments [C:\Users\ian\Code\boostfail
\bld\main.vcxproj]
C:\Users\ian\Code\boostfail\bld\_deps\boost-src\boost/multiprecision/eigen.hpp(157): message : see declaration of 'Eigen::internal::conj_impl' [C:\Users\ian\Code\boostfail\bld\main.vcxpr
oj]
C:\Users\ian\Code\boostfail\externals\eigen\Eigen\src/Core/util/Meta.h(454,1): warning C4996: 'std::result_of<T>': warning STL4014: std::result_of and std::result_of_t are deprecated in
C++17. They are superseded by std::invoke_result and std::invoke_result_t. You can define _SILENCE_CXX17_RESULT_OF_DEPRECATION_WARNING or _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS to ackno
wledge that you have received this warning. [C:\Users\ian\Code\boostfail\bld\main.vcxproj]
with
[
T=Eigen::internal::scalar_difference_op<boost::multiprecision::number<boost::multiprecision::backends::complex_adaptor<boost::multiprecision::backends::cpp_bin_float<113,bo
ost::multiprecision::backends::digit_base_2,void,int16_t,49154,16383>>,boost::multiprecision::et_off>,complex_type> (const boost::multiprecision::number<boost::multiprecision::backends
::complex_adaptor<boost::multiprecision::backends::cpp_bin_float<113,boost::multiprecision::backends::digit_base_2,void,int16_t,49154,16383>>,boost::multiprecision::et_off> &,const boo
st::multiprecision::number<boost::multiprecision::backends::complex_adaptor<boost::multiprecision::backends::cpp_bin_float<113,boost::multiprecision::backends::digit_base_2,void,int16_
t,49154,16383>>,boost::multiprecision::et_off> &)
]
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include\type_traits(1708,45): message : see declaration of 'std::result_of' [C:\Users\ian\Code\bo
ostfail\bld\main.vcxproj]
C:\Users\ian\Code\boostfail\externals\eigen\Eigen\src/Core/CwiseBinaryOp.h(38): message : see reference to class template instantiation 'Eigen::internal::result_of<BinaryOp (const boost:
:multiprecision::number<boost::multiprecision::backends::complex_adaptor<boost::multiprecision::backends::cpp_bin_float<113,boost::multiprecision::backends::digit_base_2,void,int16_t,491
54,16383>>,boost::multiprecision::et_off> &,const boost::multiprecision::number<boost::multiprecision::backends::complex_adaptor<boost::multiprecision::backends::cpp_bin_float<113,boost:
:multiprecision::backends::digit_base_2,void,int16_t,49154,16383>>,boost::multiprecision::et_off> &)>' being compiled [C:\Users\ian\Code\boostfail\bld\main.vcxproj]
with
[
BinaryOp=Eigen::internal::scalar_difference_op<boost::multiprecision::number<boost::multiprecision::backends::complex_adaptor<boost::multiprecision::backends::cpp_bin_float
<113,boost::multiprecision::backends::digit_base_2,void,int16_t,49154,16383>>,boost::multiprecision::et_off>,complex_type>
]
C:\Users\ian\Code\boostfail\externals\eigen\Eigen\src/Core/CwiseBinaryOp.h(155): message : see reference to class template instantiation 'Eigen::internal::traits<Derived>' being compiled
[C:\Users\ian\Code\boostfail\bld\main.vcxproj]
with
[
Derived=Eigen::CwiseBinaryOp<Eigen::internal::scalar_difference_op<boost::multiprecision::number<boost::multiprecision::backends::complex_adaptor<boost::multiprecision::bac
kends::cpp_bin_float<113,boost::multiprecision::backends::digit_base_2,void,int16_t,49154,16383>>,boost::multiprecision::et_off>,complex_type>,const Eigen::Product<Eigen::Matrix<comple
x_type,2,2,0,2,2>,Eigen::Matrix<complex_type,2,2,0,2,2>,0>,const Eigen::Matrix<complex_type,2,2,0,2,2>>
]
C:\Users\ian\Code\boostfail\externals\eigen\Eigen\src/Core/CwiseBinaryOp.h(77): message : see reference to class template instantiation 'Eigen::CwiseBinaryOpImpl<BinaryOp,LhsType,RhsType
,Eigen::internal::cwise_promote_storage_type<Eigen::Dense,Eigen::internal::traits<Derived>::StorageKind,BinaryOp>::ret>' being compiled [C:\Users\ian\Code\boostfail\bld\main.vcxproj]
with
[
BinaryOp=Eigen::internal::scalar_difference_op<boost::multiprecision::number<boost::multiprecision::backends::complex_adaptor<boost::multiprecision::backends::cpp_bin_float
<113,boost::multiprecision::backends::digit_base_2,void,int16_t,49154,16383>>,boost::multiprecision::et_off>,complex_type>,
LhsType=Eigen::Product<Eigen::Matrix<complex_type,2,2,0,2,2>,Eigen::Matrix<complex_type,2,2,0,2,2>,0>,
RhsType=Eigen::Matrix<complex_type,2,2,0,2,2>,
Derived=Eigen::Matrix<complex_type,2,2,0,2,2>
]
C:\Users\ian\Code\boostfail\main.cpp(27): message : see reference to class template instantiation 'Eigen::CwiseBinaryOp<Eigen::internal::scalar_difference_op<boost::multiprecision::numbe
r<boost::multiprecision::backends::complex_adaptor<boost::multiprecision::backends::cpp_bin_float<113,boost::multiprecision::backends::digit_base_2,void,int16_t,49154,16383>>,boost::mult
iprecision::et_off>,_Scalar>,const Derived,const Eigen::Matrix<_Scalar,2,2,0,2,2>>' being compiled [C:\Users\ian\Code\boostfail\bld\main.vcxproj]
with
[
_Scalar=complex_type,
Derived=Eigen::Product<Eigen::Matrix<complex_type,2,2,0,2,2>,Eigen::Matrix<complex_type,2,2,0,2,2>,0>
]
(base) PS C:\Users\ian\Code\boostfail\bld>
Similar problem with g++ 9.3.0 on ubuntu 20.04:
[100%] Building CXX object CMakeFiles/boosteigen.dir/boosteigentest.cpp.o
In file included from /input/boosteigentest.cpp:3:
/bld/_deps/boost-src/boost/multiprecision/eigen.hpp:147:14: error: redeclared with 2 template parameters
147 | struct conj_impl;
| ^~~~~~~~~
In file included from /input/externals/ChebTools/externals/Eigen/Eigen/Core:164,
from /bld/_deps/boost-src/boost/multiprecision/eigen.hpp:10,
from /input/boosteigentest.cpp:3:
/input/externals/ChebTools/externals/Eigen/Eigen/src/Core/MathFunctions.h:263:34: note: previous declaration 'template<class Scalar> struct Eigen::internal::conj_impl' used 1 template parameter
263 | template<typename Scalar> struct conj_impl : conj_default_impl<Scalar> {};
| ^~~~~~~~~
In file included from /input/boosteigentest.cpp:3:
/bld/_deps/boost-src/boost/multiprecision/eigen.hpp:157:100: error: wrong number of template arguments (2, should be 1)
157 | struct conj_impl<boost::multiprecision::detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, true>
| ^
In file included from /input/externals/ChebTools/externals/Eigen/Eigen/Core:164,
from /bld/_deps/boost-src/boost/multiprecision/eigen.hpp:10,
from /input/boosteigentest.cpp:3:
/input/externals/ChebTools/externals/Eigen/Eigen/src/Core/MathFunctions.h:263:34: note: provided for 'template<class Scalar> struct Eigen::internal::conj_impl'
263 | template<typename Scalar> struct conj_impl : conj_default_impl<Scalar> {};
| ^~~~~~~~~